Ваадин: Дополнительное окно

Я пытаюсь использовать дополнительное окно, но либо компоненты, которые я пытаюсь вставить в него, отображаются в «главном окне», либо я получаю исключение java.lang.UnsupportedOperationException. Я покажу вам оба случая. Я хотел бы разместить HorizontalLayout во вспомогательном окне, когда мне нужно вставить некоторые реальные компоненты, а не только метку и кнопку.

public class SubWindow extends CustomComponent {

    Window mainWindow;  // Reference to main window
    Window myWindow;    // The window to be opened

    public SubWindow(Window main) {
        mainWindow = main;
        createWindow();
    }

    public void createWindow() {
        myWindow = new Window("My Dialog");

        HorizontalLayout layout = new HorizontalLayout();

        // Add the window inside the main window. 
        mainWindow.addWindow(myWindow);

        layout.addComponent(new Label("A label"));
        layout.addComponent(new Button("Ok"));

        // The composition root MUST be set
        setCompositionRoot(layout);

        myWindow.addComponent(layout);
    } 
}

Когда я запускаю это и открываю новое дополнительное окно, используя

window = new Window("Title");
setMainWindow(window);
window.addComponent(new SubWindow(window));

я получил

СЕРЬЕЗНО: ошибка терминала:

com.vaadin.event.ListenerMethod $ MethodException

Причина: java.lang.UnsupportedOperationException в com.vaadin.event.ListenerMethod.receiveEvent (ListenerMethod.java:510) в com.vaadin.event.EventRouter.fireEvent (EventRouter.java:164)

...

Вызвано: java.lang.UnsupportedOperationException в com.vaadin.ui.CustomComponent.removeComponent (CustomComponent.java:248) в com.vaadin.ui.AbstractComponentContainer.addComponent (AbstractComponentContainer.java:207)

...

С другой стороны, если я переключаюсь между setCompositionRoot (макет) и myWindow.addComponent (макет), метка и кнопка просто оказываются в главном окне, а не во вновь созданном дополнительном окне.

Что мне не хватает?


person Dennis S    schedule 21.06.2011    source источник


Ответы (1)


Я предлагаю вам расширить Window напрямую, а не использовать CustomLayout. Макет не может содержать окно - все наоборот.

Изменять

  • public class SubWindow extends CustomComponent to public class SubWindow extends Window
  • myWindow = new Window("My Dialog"); to setCaption("My Dialog");
  • а также

    // The composition root MUST be set
    setCompositionRoot(layout);
    
    myWindow.addComponent(layout);
    

    to setContent(layout);

Это стандартный способ создания подокна, точно так же, как вы создаете главное окно. Я бы также переместил mainWindow.addWindow(myWindow); за пределы класса и не передавал объект mainwindow подокну, потому что это не является частью объекта подокна.

person Jens Jansson    schedule 21.06.2011
comment
Спасибо за ответ, теперь работает как шарм. Для людей с подобными проблемами вот хорошее руководство по Подокнам - person Dennis S; 21.06.2011