Ваадин: Подокно - PullRequest
       15

Ваадин: Подокно

1 голос
/ 21 июня 2011

Я пытаюсь использовать подокно, но либо компоненты, которые я пытаюсь вставить в него, отображаются в "главном окне", либо я получаю исключение 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));

Я получаю

SEVERE: ошибка терминала:

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) at com.vaadin.ui.AbstractComponentContainer.addComponent (AbstractComponentContainer.java:207)

...

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

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

1 Ответ

3 голосов
/ 21 июня 2011

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

Изменить

  • public class SubWindow extends CustomComponent до public class SubWindow extends Window
  • myWindow = new Window("My Dialog"); до setCaption("My Dialog");
  • и

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

    до setContent(layout);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...