使用非静态方法getUI()。getPage()返回错误:IllegalArgumentException

时间:2017-11-02 14:13:56

标签: java vaadin 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()返回null

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

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

我的用户界面是:

@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;
    }
}

1 个答案:

答案 0 :(得分:1)

getUI()在您的情况下返回null,因为您正在创建的实例还没有父级。例如,在将LayoutView组件添加到布局或面板时,将设置父级。 getUI()遍历父节点到UI根目录或返回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指出的更常见和更清晰的解决方案是使用View的enter方法而不是构造函数。正如您所看到的那样,不再需要侦听器,因为组件已经附加到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!"));
}