在Vaadin中将组件创建为静态工厂样式(Singleton)

时间:2014-07-22 07:20:07

标签: vaadin vaadin7

我想使用静态工厂样式(或使用单件模式)创建自定义Window

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)

那么,如何将自定义Windows与静态工厂样式一起使用以及如何隐藏和显示Windows

2 个答案:

答案 0 :(得分:4)

我认为最简单的方法是每次调用show()方法时创建一个新的Window对象。

答案 1 :(得分:0)

错误表明您的窗口已经有父级。这意味着当您关闭它时它不会被删除。实际上我以前从来没有遇到过这个错误。但如果你愿意,你可以试试这个:

 window.addCloseListener(new CloseListener() {

  @Override
  public void windowClose(CloseEvent e) {
    AbstractSingleComponentContainer.removeFromParent(subwindow);
  }
});

这应该可以解决您的问题。