从JavaScript gwt调用Java
嗨,我有以下奇怪的问题: 我有gwt申请。它包含3个图像小部件和一个按钮。按一下按钮,我是 调用函数X(),然后在X内部通过将实例传递给Javascript函数调用Test(testscan实例) 现在来看一下测试函数。我试图从那里调用名为“updateImageContent”的Java函数 当我运行应用程序时,“testscan”类的实例为空,原因是什么从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 =
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应用程序。我试图首先创建测试项目,但发现它不起作用。我的外部应用程序需要一些回调机制。