【问题标题】:GWT JSNI - Call java method of specific objectGWT JSNI - 调用特定对象的java方法
【发布时间】:2013-06-13 19:17:47
【问题描述】:

考虑以下小部件。我将其中两个添加到我的页面中。第一个获得名称“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() 方法?我可以在这里使用某种命名空间方法吗?

【问题讨论】:

    标签: java javascript gwt namespaces jsni


    【解决方案1】:

    您遇到的问题是在创建MyComponent 时,$wnd.myWidget 被设置为引用该项目。因此,如果您创建 MyComponent #1,然后创建 MyComponent #2,您将始终拥有等于 MyComponent #2 的 $wnd.myWidget

    不定义设置JS变量的方法,直接在native方法中引用window,如下:

    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()();
    }-*/;
    

    【讨论】:

    • 另请注意,这种方法应该完全消除declareMethod 方法。
    • 其实这并不能解决我的问题。这适用于这种情况。但是如果我想从这个之外的任何地方调用该方法(例如外部 javascript)。然后我没有可用的“comp”变量。
    【解决方案2】:

    我现在通过接收我感兴趣的事件来解决我的问题,例如:构造函数中的 sinkEvents(Event) 并在我的 onBrowserEvent(Event e) 方法中处理它们。对于我的问题,这是一种更简单、更方便的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多