瓦丁:子窗口

时间:2011-06-21 08:10:01

标签: vaadin custom-component

我正在尝试使用子窗口但是我尝试放入的组件显示在“mainwindow”中,或者我收到了java.lang.UnsupportedOperationException。我会告诉你两个案子。当我需要放入一些真正的组件而不仅仅是Label和Button时,我想在子窗口中放置一个Horizo​​ntalLayout。

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(layout)和myWindow.addComponent(layout)之间切换位置,Label和Button只会在主窗口而不是新创建的子窗口中结束。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

我建议您直接扩展Window而不是通过CustomLayout。布局不能包含窗口 - 它反过来。

更改

  • public class SubWindow extends CustomComponentpublic 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);移到类外部而不将mainwindow对象传递给子窗口,因为那不是subwindow对象的一部分。