我有一个基本问题。 我正在使用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;
}
}
答案 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!"));
}