java - Vaadin View - 导航器无法解析

标签 java view vaadin navigator

我是 Vaadin 的新手。我目前正在编写一个简单的服务器端应用程序。我正在从 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 个错误

navigator can't be resolved

MAINVIEW cannot be resolved to variable

我多次阅读了所有内容并试图找到解决方案,但似乎没有任何效果。

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 的基础知识。

第一个错误:

navigator can't be resolved

StartViewMainView 未获取 navigator 实例。您可以通过 setter 或构造函数传递它,也可以通过以下方式访问导航器:

UI.getCurrent().getNavigator()

其次,实际上不需要创建 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 cannot be resolved to variable

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

ClassName.FIELD

因此,在您的示例中(只要您将 navigator 传递给您的 MainStart View 类:

navigator.navigateTo(MyUI.MAINVIEW);

关于java - Vaadin View - 导航器无法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394326/

相关文章:

Android:为什么 View 没有 maxHeight?

Android fragment 找不到 id 的 View

Android:如何获得更快的 onDraw()

java - Vaadin - 多个按钮实例 - 不同的点击监听器操作

java - 如何从uri确定文件的文件扩展名

java - 当文本字段中恰好有 13 个字符时触发按钮

java - Java 指纹识别器

java - 我已经在 gradle 编译 'com.firebaseui:firebase-ui-auth:2.3.0' 中编写了这一行,但仍然收到错误 "cannot resolve symbol ' Auth UI'”

tomcat - 如何使用 IntelliJ 和 Tomcat 热部署 Vaadin

java - 如何从 Vaadin 中的任何地方获取应用程序实例?