Vaadin观点 - 导航器无法解决

时间:2017-09-24 20:02:19

标签: java views 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个错误

  

导航器无法解析

  

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()));
    }
}

你能告诉我我做错了什么吗?我无法理解为什么它无法通过。

1 个答案:

答案 0 :(得分:0)

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

第一个错误:

  

导航器无法解决

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());
    }

@Edit

如果是关于下一个错误:

  

MAINVIEW无法解析为变量

如果您使用静态字段,则应以这种方式访问​​它们:

ClassName.FIELD

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

navigator.navigateTo(MyUI.MAINVIEW);