一般的な目的:javascriptから非静的javaメソッドを呼び出す
説明:Javaアプレットコードの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に追加された具体的なウィジェットを見つけてgetSomeInstancedData()
、JavaScriptで非静的メソッドを呼び出したいと思います。それは可能ですか?
次のようなsmthを想定します。
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を実装しますが、遅延バインディングを使用するClassCastExceptionのため、progectはSomeWidgetでViewをうまく表示しません。
ClassCastException: com.mypackage.widgets.SomeWidgetExporterImpl cannot be cast to com.mypackage.widgets.SomeWidget
それで、おそらくウィジェットのjavascriptオブジェクトを見つけて、それをエクスポートされたjavaメソッドを呼び出す他のメソッドはありますか?いずれにせよ、どんなアイデアでも大歓迎です。