GWT JSNI -调用特定对象的java方法

GWT JSNI - Call java method of specific object

本文关键字:对象 java 方法 JSNI 调用 GWT      更新时间:2023-09-26

考虑以下小部件。我把其中两个添加到我的页面上。第一个获得名称为"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,你将始终得到等于MyComponent #2的$wnd.myWidget

与其定义一个设置JS变量的方法,不如直接在本机方法中引用窗口,如下所示:

public native void myonclick(MyComponent comp) /*-{
    comp.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;

然后,在click处理程序中,按如下方式调用myonclick:

@Override
public void onClick(ClickEvent event) {
     myonclick(MyComponent.this);
}

我认为这应该可行。如果有什么问题请告诉我,我会尽力帮忙的。

:你可以尝试以下,但老实说,我不知道它是否会与外部javascript玩得很好。我从来没有真正处理过这个用例。

public native void myonclick() /*-{
    this.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;

我正在解决我的问题,现在下沉的事件,我感兴趣的,例如:sinkEvents(事件)在构造函数和处理它们在我的onBrowserEvent(事件e)方法。对于我的问题,这是一个更简单和方便的方法。