Using the non-static method getUI().getPage() return an error : IllegalArgumentException

Using the non-static method getUI().getPage() return an error : IllegalArgumentException

我有一个基本问题。 我正在使用 Vaadin 8。

当我使用时:

Page.getCurrent().setTitle(IStringConstants.HOMEPAGE_LABEL);

这没有问题。

而且,当我使用

 getUI().getPage().setTitle(IStringConstants.HOMEPAGE_LABEL);

我收到一个错误:java.lang.IllegalArgumentException: Unable to create an instance of {0}. The constructor threw an exception.

因为getUI()returnnull

我的代码很简单,在我的主页上:

public class HomepageView extends CustomComponent implements View {
 public HomepageView() {
    getUI().getPage().setTitle(IStringConstants.HOMEPAGE_LABEL);
    VerticalLayout layout = new VerticalLayout();
    layout.setSizeFull();
    setCompositionRoot(layout);
 }
}

而我的 UI 是:

@Theme("mytheme")
public class myUI extends UI {
    private static final long serialVersionUID = 1L;
    private Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        navigator = new Navigator(this, this);
        navigator.addView("", HomepageView.class);
    }

    @WebServlet(urlPatterns = "/*", name = "myUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = myUI.class, productionMode = false)
    public static class myUIServlet extends VaadinServlet {

        private static final long serialVersionUID = 1L;
    }
}

getUI() returns null 在你的例子中,因为你正在创建的实例还没有父级。例如,当您将 HomepageView 组件添加到布局或面板时,就会设置父级。 getUI() 遍历父代直到 UI 根或 returns null 找不到这样的父代。您可以在附加侦听器中调用 getUI().getPage().setTitle(IStringConstants.HOMEPAGE_LABEL);

public HomepageView() {
    this.addAttachListener(e -> {
        getUI().getPage().setTitle(IStringConstants.HOMEPAGE_LABEL);
    });
    VerticalLayout layout = new VerticalLayout();
    layout.setSizeFull();
    setCompositionRoot(layout);

    // show something
    layout.addComponent(new Label("Hello World!"));
}

编辑

正如 Morfic 所指出的,更常见和更简洁的解决方案是使用视图的输入方法而不是构造函数。如您所见,不再需要侦听器,因为组件已经附加到 UI 树:

@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
    getUI().getPage().setTitle("This is a title");
    VerticalLayout layout = new VerticalLayout();
    layout.setSizeFull();
    setCompositionRoot(layout);
    layout.addComponent(new Label("Hello World!"));
}