Создание компонентов в виде статического заводского стиля (Singleton) в Vaadin

Я хочу создать пользовательское окно, используя статический заводской стиль (или с одноэлементным шаблон).

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?


person Cataclysm    schedule 22.07.2014    source источник
comment
Вы не должны создавать статическое окно (или любой другой компонент) в Vaadin. Потому что это означает, что один и тот же экземпляр будет использоваться всеми пользователями приложения, а это неправильно. Просто удалите шаблон singleton, и проблема будет устранена (а также будущие проблемы, когда у вас есть несколько пользователей для приложения).   -  person Henri Kerola    schedule 23.07.2014


Ответы (2)


Я думаю, что самый простой способ — создавать новый объект окна каждый раз, когда вы вызываете метод show().

person d2k2    schedule 22.07.2014
comment
Этот вид ответов на проблему, которая на самом деле является шаблоном singleton. Никогда не следует создавать одноэлементные окна (или другие компоненты) в Vaadin. - person Henri Kerola; 23.07.2014

Ошибка говорит о том, что у вашего окна уже есть родитель. Это означает, что он не был удален, когда вы закрыли его. На самом деле странно, у меня никогда не было этой ошибки раньше. Но вы можете попробовать это, если хотите:

 window.addCloseListener(new CloseListener() {

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

Это должно решить вашу проблему.

person deltascience    schedule 22.07.2014
comment
Да, это работает для меня. Спасибо . Кстати, если удалить окно из родительского, будет ли экземпляр окна нулевым? - person Cataclysm; 22.07.2014
comment
Нет, окно все еще будет там, но не будет видно, потому что оно не добавлено в контейнер на вашей странице. - person deltascience; 22.07.2014
comment
Я проголосовал против, потому что фактическая проблема в вопросе - это одноэлементный шаблон. - person Henri Kerola; 23.07.2014