簡體   English   中英

GWT JSNI-調用特定對象的java方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM