在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中创建单例窗口或其他组件。