繁体   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