我是 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
StartView
和 MainView
未获取 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
传递给您的 Main
和 Start
View 类:
navigator.navigateTo(MyUI.MAINVIEW);
关于java - Vaadin View - 导航器无法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394326/