在Vaadin中将零部件创建为静态工厂样式(单例)
我想创建自定义使用静态工厂风格或单例模式在Vaadin中将零部件创建为静态工厂样式(单例),vaadin,vaadin7,Vaadin,Vaadin7,我想创建自定义使用静态工厂风格或单例模式 public class MyWindow extends CustomComponent { private static Window window; private static MyWindow instance; public static MyWindow getInstance() { if (instance == null) { instance = new MyWindow(); } retu
public class MyWindow extends CustomComponent {
private static Window window;
private static MyWindow instance;
public static MyWindow getInstance() {
if (instance == null) {
instance = new MyWindow();
}
return instance;
}
public void show() {
UI.getCurrent().addWindow(window);
}
private MyWindow() {
CustomLayout layout = new CustomLayout("My HTML Layout");
window = new Window("My Window");
window.center();
window.setWidth("615px");
window.setModal(true);
window.setResizable(false);
window.setClosable(true);
window.setContent(layout);
}
}
并调用为MyWindow.getInstance.show;第一次呼叫还可以,但在关闭此窗口并重新打开后,我在控制台上看到以下错误日志
Jul 23, 2014 3:42:39 AM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE:
java.lang.IllegalStateException: com.vaadin.ui.Window already has a parent.
at com.vaadin.ui.AbstractComponent.setParent(AbstractComponent.java:469)
at com.vaadin.ui.Window.setParent(Window.java:155)
at com.vaadin.ui.UI.attachWindow(UI.java:501)
at com.vaadin.ui.UI.addWindow(UI.java:490)
那么,如何使用静态factory样式自定义以及如何隐藏和显示?错误表明您的窗口已经有父窗口。这意味着当你关闭它时它没有被移除。真奇怪,我以前从来没有犯过这样的错误。但如果您愿意,可以尝试以下方法:
window.addCloseListener(new CloseListener() {
@Override
public void windowClose(CloseEvent e) {
AbstractSingleComponentContainer.removeFromParent(subwindow);
}
});
这应该可以解决你的问题 错误表示您的窗口已经有父窗口。这意味着当你关闭它时它没有被移除。真奇怪,我以前从来没有犯过这样的错误。但如果您愿意,可以尝试以下方法:
window.addCloseListener(new CloseListener() {
@Override
public void windowClose(CloseEvent e) {
AbstractSingleComponentContainer.removeFromParent(subwindow);
}
});
这应该可以解决你的问题 我认为最简单的方法是每次调用show方法时创建一个新的Window对象 我认为最简单的方法是每次调用show方法时创建一个新的Window对象 是的,它对我有用。谢谢顺便说一句,如果从父级删除窗口,窗口实例是否为空?否,窗口仍将存在,但不可见,因为它未添加到页面中的容器中。我投了反对票,因为问题中的实际问题是单例模式。是的,它对我有效。谢谢顺便说一句,如果从父级删除窗口,窗口实例是否为空?否窗口仍将存在,但不可见,因为它未添加到页面中的容器中。我投了反对票,因为问题中的实际问题是单例模式。您不应在Vaadin中创建静态窗口或任何其他组件。因为这意味着同一个实例将由应用程序的所有用户共享,这是错误的。只要删除singleton模式,问题就解决了,当应用程序有多个用户时,将来也会出现问题。不应该在Vaadin中创建静态窗口或任何其他组件。因为这意味着同一个实例将由应用程序的所有用户共享,这是错误的。只要删除单例模式,问题就解决了,当应用程序有多个用户时,将来也会出现问题。这类问题的答案实际上就是单例模式。千万不要在Vaadin中创建单例窗口或其他组件。这类问题的答案实际上就是单例模式。千万不要在Vaadin中创建单例窗口或其他组件。