我正在尝试使用子窗口但是我尝试放入的组件显示在“mainwindow”中,或者我收到了java.lang.UnsupportedOperationException。我会告诉你两个案子。当我需要放入一些真正的组件而不仅仅是Label和Button时,我想在子窗口中放置一个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(layout)和myWindow.addComponent(layout)之间切换位置,Label和Button只会在主窗口而不是新创建的子窗口中结束。
我错过了什么?
答案 0 :(得分:3)
我建议您直接扩展Window而不是通过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);
移到类外部而不将mainwindow对象传递给子窗口,因为那不是subwindow对象的一部分。