我是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()));
}
}
你能告诉我我做错了什么吗?我无法理解为什么它无法通过。
答案 0 :(得分:0)
您面临的问题实际上是Java的基础知识。
第一个错误:
导航器无法解决
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());
}
@Edit
如果是关于下一个错误:
MAINVIEW无法解析为变量
如果您使用静态字段,则应以这种方式访问它们:
ClassName.FIELD
因此,在您的示例中(只要您将navigator
传递给Main
和Start
View类:
navigator.navigateTo(MyUI.MAINVIEW);