Как перемещаться между представлениями в Vaadin v8? - PullRequest
0 голосов
/ 11 марта 2020

Могут ли некоторые сообщить мне, почему я получаю исключение NullPointerException, когда мы пытаемся перейти от входа в систему к домашней странице.

Страница входа, которая имеет метод NavigaeTO, указывающий на HomePage, находится ниже

public class MyUI extends UI implements View {

    Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout vlayout = new VerticalLayout();

        final TextField name1 = new TextField();
        name1.setCaption("Username");


        final TextField name2 = new TextField();
        name2.setCaption("Password");


        final HorizontalLayout hlaylout1 = new HorizontalLayout();
        Button button1 = new Button("Login",
        new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {

                System.out.print("Here is the View String "+NavigatorUI.HOMEVIEW);

             getNavigator().navigateTo(NavigatorUI.HOMEVIEW);
            }
        });
        Button button2 = new Button("Cancel");

        hlaylout1.addComponents(button1, button2);



        vlayout.addComponents(name1,name2, hlaylout1);

        setContent(vlayout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}

Домашняя страница, которая должна открываться при нажатии кнопки входа, равна

public class HomeView extends UI implements View {

    Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout vlayout = new VerticalLayout();

        final TextField name1 = new TextField();
        name1.setCaption("HomePage");           


        vlayout.addComponents(name1);

        setContent(vlayout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}

И класс навигатора:

public class NavigatorUI extends UI {

    Navigator navigator;
    public static final String HOMEVIEW = "HOMEVIEW";

    @Override
    protected void init(VaadinRequest request) {
        getPage().setTitle("Navigation Example");

        // Create a navigator to control the views  
        navigator = new Navigator(this, this);

        // Create and register the views
        navigator.addView(HOMEVIEW, new HomeView());
        navigator.addView("", new MyUI());
 //       navigator.addView(MAINVIEW, new MainView());

}

}

Я получаю исключение NullPointerException для метода NavigateTo. Может кто-нибудь сообщить мне, в чем проблема?

1 Ответ

3 голосов
/ 11 марта 2020

В вашем коде есть несколько проблем:

  • Вы определяете несколько сервлетов, достаточно одного
  • Все ваши представления расширяют пользовательский интерфейс, только NavigatorUI должен расширять пользовательский интерфейс, остальные могут строить макеты в конструкторе
  • Ваш сервлет настроен на использование MyUI, но для этого пользовательского интерфейса должно быть NavigatorUI
  • Вы должны переопределить getNavigator() в NavigatorUI, чтобы вернуть созданный вами навигатор, или позвоните setNavigator(navigator).
  • . Вы должны удалить поле Navigator navigator из ваших просмотров.
...