Java Vaadin视图-导航器可以';无法解决

Java Vaadin视图-导航器可以';无法解决,java,views,vaadin,navigator,Java,Views,Vaadin,Navigator,我是瓦丁的新手。我目前正在编写一个简单的服务器端应用程序。我正在从Vaadin网站的文档中学习,目前的一个导航示例不起作用。我无法编译和运行/调试应用程序 这是我的主要UI类: @Theme("mytheme") public class MyUI extends UI { Navigator navigator; protected static final String MAINVIEW = "main"; @Override protected void

我是瓦丁的新手。我目前正在编写一个简单的服务器端应用程序。我正在从Vaadin网站的文档中学习,目前的一个导航示例不起作用。我无法编译和运行/调试应用程序

这是我的主要UI类:

@Theme("mytheme")
public class MyUI extends UI {

    Navigator navigator;
    protected static final String MAINVIEW = "main";

    @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("", new StartView());
        navigator.addView(MAINVIEW, new MainView());
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}
我这里没有任何问题。我已经实现了StartView类,这就是我得到错误的地方。在
navigator.navigateTo(MAINVIEW)有2个错误

导航器无法解析

无法将MAINVIEW解析为变量

我把所有的东西都读了很多遍,试图找到解决办法,但似乎什么都不管用

public class StartView extends VerticalLayout implements View {
    public StartView() {
        setSizeFull();

        Button button = new Button("Go to Main View",
                new Button.ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                navigator.navigateTo(MAINVIEW);
            }
        });
        addComponent(button);
        setComponentAlignment(button, Alignment.MIDDLE_CENTER);
    }

    @Override
    public void enter(ViewChangeEvent event) {
        Notification.show("Welcome to the Animal Farm");
    }
}
在MainView类中也会发生同样的事情

@DesignRoot
public class MainView extends VerticalLayout implements View {
    // Menu navigation button listener
    class ButtonListener implements Button.ClickListener {
        String menuitem;
        public ButtonListener(String menuitem) {
            this.menuitem = menuitem;
        }

        @Override
        public void buttonClick(ClickEvent event) {
            // Navigate to a specific state
            navigator.navigateTo(MAINVIEW + "/" + menuitem);
        }
    }

    VerticalLayout menuContent;
    Panel equalPanel;
    Button logout;

    public MainView() {
        Design.read(this);

        menuContent.addComponent(new Button("Pig",
                  new ButtonListener("pig")));
        menuContent.addComponent(new Button("Cat",
                  new ButtonListener("cat")));
        menuContent.addComponent(new Button("Dog",
                  new ButtonListener("dog")));
        menuContent.addComponent(new Button("Reindeer",
                  new ButtonListener("reindeer")));
        menuContent.addComponent(new Button("Penguin",
                  new ButtonListener("penguin")));
        menuContent.addComponent(new Button("Sheep",
                  new ButtonListener("sheep")));

        // Allow going back to the start
        logout.addClickListener(event -> // Java 8
            navigator.navigateTo(""));
    }

    @DesignRoot
    class AnimalViewer extends VerticalLayout {
        Label watching;
        Embedded pic;
        Label back;

        public AnimalViewer(String animal) {
            Design.read(this);

            watching.setValue("You are currently watching a " +
                              animal);
            pic.setSource(new ThemeResource(
                "img/" + animal + "-128px.png"));
            back.setValue("and " + animal +
                " is watching you back");
        }
    }

    @Override
    public void enter(ViewChangeEvent event) {
        if (event.getParameters() == null
            || event.getParameters().isEmpty()) {
            equalPanel.setContent(
                new Label("Nothing to see here, " +
                          "just pass along."));
            return;
        } else
            equalPanel.setContent(new AnimalViewer(
                event.getParameters()));
    }
}

你能告诉我我做错了什么吗?我不明白为什么它不能通过。

您面临的问题实际上是Java的基础知识

第一个错误:

导航器无法解析

StartView
MainView
不获取
navigator
实例。您可以通过setter或构造函数传递它,也可以通过以下方式到达navigator:

UI.getCurrent().getNavigator()
ClassName.FIELD
其次,实际上不需要创建
Navigator
的实例,因为您可以在
MyUI
中调用上面的行,所以它将如下所示:

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

        // Create and register the views
        UI.getCurrent().getNavigator().addView("", new StartView());
        UI.getCurrent().getNavigator().addView(MAINVIEW, new MainView());
    }
@编辑

如果是关于下一个错误:

无法将MAINVIEW解析为变量

如果使用的是静态字段,则应通过以下方式访问它们:

UI.getCurrent().getNavigator()
ClassName.FIELD
因此,在您的示例中(只要将
navigator
传递给
Main
Start
视图类:

navigator.navigateTo(MyUI.MAINVIEW);

您确定MAINVIEW在范围内吗?