[英]GWT JSNI - Call java method of specific object
考慮以下小部件。 我將其中兩個添加到我的頁面。 第一個名稱為“ widget1”,第二個名稱為“ widget2”。 它只是應該給出自己的名稱,但是是從javascript調用的。 (該示例沒有任何意義,但僅僅是一個簡單的示例,可以弄清楚如何完成此操作。)
public class MyComponent extends Composite{
String name;
public MyComponent(String name) {
this.name =name;
Button b = new Button(name);
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
myonclick();
}
});
initWidget(b);
declareMethod(this);
}
public native void declareMethod(MyComponent myWidget) /*-{
$wnd.myWidget = myWidget;
}-*/;
public native void myonclick() /*-{
$wnd.myWidget.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
public void doSomething() {
Window.alert(name);
}
}
我現在的問題是:兩個按鈕都提示消息“ widget2”。 那是因為我重寫了“ declareMethod”中的“ myWidget”變量。 如何歸檔調用正確對象的doSomething()方法? 我可以在這里使用某種命名空間方法嗎?
您遇到的問題是在創建MyComponent
時, $wnd.myWidget
設置為引用該項目。 所以,如果你創建MyComponent
#1,然后MyComponent
#2,你將永遠有$wnd.myWidget
,等於MyComponent
2#。
與其定義一個設置JS變量的方法,不如直接在本機方法中引用窗口,如下所示:
public native void myonclick(MyComponent comp) /*-{
comp.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
然后,在點擊處理程序中,如下調用myonclick
:
@Override
public void onClick(ClickEvent event) {
myonclick(MyComponent.this);
}
我認為這應該有效。 讓我知道是否有任何問題,我會盡力幫助。
更新 :您可以嘗試以下操作,但是老實說,我不知道它是否可以與外部javascript一起很好地運行。 我從來沒有真正需要通過這個用例。
public native void myonclick() /*-{
this.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
我現在通過下沉我感興趣的事件來解決我的問題,例如:構造函數中的sinkEvents(Event)並在我的onBrowserEvent(Event e)方法中處理它們。 這是解決我的問題的一種更簡單,更方便的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.