Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaScript gwt调用Java_Java_Gwt - Fatal编程技术网

从JavaScript gwt调用Java

从JavaScript gwt调用Java,java,gwt,Java,Gwt,嗨,我有以下奇怪的问题: 我有gwt申请。它包含3个图像小部件和一个按钮。按一下按钮,我是 调用函数X(),然后在X内部通过将实例传递给Javascript函数调用Test(testscan实例) 现在来看一下测试函数。我试图从那里调用名为“updateImageContent”的Java函数 当我运行应用程序时,“testscan”类的实例为空,原因是什么 public class testscan implements EntryPoint { private Image image_0 =

嗨,我有以下奇怪的问题:

我有gwt申请。它包含3个图像小部件和一个按钮。按一下按钮,我是 调用函数X(),然后在X内部通过将实例传递给Javascript函数调用Test(testscan实例)

现在来看一下测试函数。我试图从那里调用名为“updateImageContent”的Java函数

当我运行应用程序时,“testscan”类的实例为空,原因是什么

public class testscan implements EntryPoint {
private Image image_0 = new Image("home.gif");
public void onModuleLoad() {
    RootPanel rootPanel = RootPanel.get("main_panel");
    rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

    VerticalPanel verticalPanel = new VerticalPanel();
    rootPanel.add(verticalPanel, 5, 5);
    verticalPanel.setSize("100%", "100%");

    HorizontalPanel horizontalPanel = new HorizontalPanel();
    verticalPanel.add(horizontalPanel);
    horizontalPanel.setSize("100%", "100%");

    Image image_1 = new Image("home.gif");
    horizontalPanel.add(image_1);
    image_1.setSize("180px", "180px");

    horizontalPanel.add(image_0);
    image_0.setSize("180px", "180px");

    Image image_2 = new Image("home.gif");
    horizontalPanel.add(image_2);
    image_2.setSize("180px", "180px");

    Button btnScan = new Button("Scan");
    verticalPanel.add(btnScan);

    btnScan.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {

            x();
        }
    });

}
public void x()
{
    Test(this);

}

public native void Test(testscan instance) /*-{
    instance.@com.sflpro.testscan.client.testscan::updateImageContent()();
}-*/;

public void updateImageContent()
{
    Window.alert("ok");
    //String s = scanFileContent();
    //Window.alert(s);
    if(image_0==null)
        Window.alert("bad");
    else
        Window.alert("good");

}

我认为您的问题在于ClickHandler作为匿名内部类实现的方式。在执行
Test
方法时,
不再有意义。您需要重写ClickHandler以将实例保存到类中:

public class testscan implements EntryPoint {
public static class MyClickHandler implements ClickHandler {
   testscan instance;
   public MyClickHandler(testscan instance) {
      this.instance = instance;
   }

   public void onClick(ClickEvent event) {
            this.instance.x();
   }
}
private Image image_0 = new Image("home.gif");
public void onModuleLoad() {
    RootPanel rootPanel = RootPanel.get("main_panel");
    rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

    VerticalPanel verticalPanel = new VerticalPanel();
    rootPanel.add(verticalPanel, 5, 5);
    verticalPanel.setSize("100%", "100%");

    HorizontalPanel horizontalPanel = new HorizontalPanel();
    verticalPanel.add(horizontalPanel);
    horizontalPanel.setSize("100%", "100%");

    Image image_1 = new Image("home.gif");
    horizontalPanel.add(image_1);
    image_1.setSize("180px", "180px");

    horizontalPanel.add(image_0);
    image_0.setSize("180px", "180px");

    Image image_2 = new Image("home.gif");
    horizontalPanel.add(image_2);
    image_2.setSize("180px", "180px");

    Button btnScan = new Button("Scan");
    verticalPanel.add(btnScan);

    btnScan.addClickHandler(new MyClickHandler(this));

}
public void x()
{
    Test(this);

}

public native void Test(testscan instance) /*-{
    instance.@com.sflpro.testscan.client.testscan::updateImageContent()();
}-*/;

public void updateImageContent()
{
    Window.alert("ok");
    //String s = scanFileContent();
    //Window.alert(s);
    if(image_0==null)
        Window.alert("bad");
    else
        Window.alert("good");

}
}

我的意思是,你这样做有点奇怪,但我知道你只是在学习,这只是一个测试应用程序,你正在玩。通常情况下,您的EntryPoint类中不会有这种类型的代码。

实际上,我看不出您的代码有什么变化:Vasil代码中的x()调用实际上是testscan。this.x()(匿名内部类有一个对其父testscan实例的隐式引用,这相当于使用一个用testscan实例显式初始化的“静态”嵌套类),因此它没有理由不起作用(除了GWT编译器优化中的一个bug,您的代码可能不会触发该bug)你是对的,我认为这是一个bug。这段代码在java中使用普通java方法运行应该可以工作。我想知道它是否也应该在托管模式下工作。我没有测试我编写的代码,但如果它是GWT中的bug,正如你所说,它不应该触发它,因为有一个“This”的引用在点击处理程序中。编译器可能会在闭包中遇到常见的Javascript错误吗?谢谢你的回答,我认为这是GWT中的一个错误。你对这类任务的解决方法有什么建议吗?我编写的代码应该可以用。但是为什么你要这样调用测试方法?它是一个实例方法,所以使用“this”内部应该可以工作。或者你尝试了,但没有成功?我尝试了你发送的代码,但它也不起作用。实际上,在实际应用中,我需要从外部应用程序(比如外部javascript)进行通信使用GWT应用程序。我试图首先创建测试项目,但发现它不起作用。我的外部应用程序需要一些回调机制。