2017-09-24 144 views
0

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

这是我的主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())); 
    } 
} 

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

+0

你确定MAINVIEW在范围内吗? – jdv

回答

0

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

第一个错误:

navigator can't be resolved

StartViewMainView没有得到navigator实例。您可以通过制定者或构造函数传递,或者你可以去导航仪这样说:

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 cannot be resolved to variable

只要你会通过 navigatorMainStart视图类

ClassName.FIELD 

所以,在你的榜样(:

如果使用的是静态字段,你应该访问它们这样

navigator.navigateTo(MyUI.MAINVIEW); 
相关问题