Вызов Java из JavaScript GWT - PullRequest
1 голос
/ 23 ноября 2011

Привет У меня есть следующая странная проблема:

У меня есть приложение gwt.он содержит 3 виджета изображения и кнопку.при нажатии кнопки я вызываю функцию X (), а затем внутри XI вызываю Test (экземпляр testscan), передавая экземпляр функции Javascript.

Теперь взгляните на функцию тестирования.Я пытаюсь вызвать функцию Java с именем "updateImageContent" оттуда. Синтаксис написан в соответствии с документацией GWT.

Когда я запускаю приложение, экземпляр класса "testscan" равен Null, в чем может быть причина?

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");

}

1 Ответ

0 голосов
/ 23 ноября 2011

Я думаю, что ваша проблема в том, как ваш ClickHandler реализован как анонимный внутренний класс.В момент выполнения метода Test значение this больше не имеет значения.Вам нужно переписать ваш 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 такого кода не было бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...