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