【发布时间】:2012-05-04 11:47:33
【问题描述】:
一般目标:从 javascript 调用一些非静态 java 方法
说明: 在 Java Applet 代码中的 DOM 上找到 gwt 的小部件并调用它的 java 方法(非静态)
JSObject win = JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject gwtWidget = (JSObject) doc.call("getElementsByName", widgetName);
//todo: have possibility to call `exported` java method over here, smth like:
//Object[] params = new Object[1];
//params[0] = widgetName;
//Object result = gwtWidget.call("exportedJavaMethod", params);
//todo: or just call global ($wnd) static JSNI bridge method:
//Object result = win.call("exportedJavaMethod", params);
//
问题是:我可以通过小部件的 id 找到小部件,但它是 DivElement,它没有任何导出的实例方法。
我的小部件类是可导出的(gwt-export):
@Export(value="somewidget")
public class SomeWidget extends SimplePanel implements ..., Exportable {
private final String id = "id_some_widget_" + count++;
private static int count = 0;
public SomeWidget () {
getElement().setAttribute("name", id);
getElement().setId(id);
}
...
public static Element getInstanceById(String elementId) {
Element someWidget= DOM.getElementById(elementId);
return someWidget;
}
public String getSomeInstancedData() {
return "useful_inner_data" + this.id;
}
所以,例如,我想找到添加到 DOM 的具体小部件并在 javascript 中调用非静态方法 getSomeInstancedData()。有可能吗?
假设:
var someWidget = document.getElementById(widgetId);
alert(someWidget.getSomeInstancedData());
//or:
var someWidgetExported = com.mypackage.widgets.somewidget.getInstanceById(listenerId);
alert(someWidgetExported.getSomeInstancedData());
在基本模块中我写:
ExporterUtil.exportAll();
有一个 View(ViewWithSomeWidget.ui.xml) 包含这个小部件:
... 基地:形式 base:SomeWidget ui:field="someWidget" ... ... /base:SomeWidget ...当 SomeWidget 没有实现 Exportable 时,项目运行良好,但我无法调用找到的小部件的 DIV 元素的非静态方法。
到那时,为了解决SomeWidget实现Exportable的问题,progect由于ClassCastException使用延迟绑定而无法很好地显示带有SomeWidget的View:
ClassCastException: com.mypackage.widgets.SomeWidgetExporterImpl cannot be cast to com.mypackage.widgets.SomeWidget
那么,可能还有其他方法可以找到小部件的 javascript 对象并将其称为导出的 java 方法吗?无论如何,任何想法都非常受欢迎。
【问题讨论】:
标签: java javascript gwt jsni exporter