2011-06-21 8 views
1

私はサブウィンドウを使用しようとしていますが、入れようとしているコンポーネントが "mainwindow"に表示されるか、java.lang.UnsupportedOperationExceptionが表示されます。私は両方の場合をお見せします。私はいくつかの実際のコンポーネントではなく、ラベルとボタンを配置する必要があるときに、サブウィンドウにHorizo​​ntalLayoutを配置したいと思います。Vaadin:Sub window

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 at c om.vaadin.event.ListenerMethod.receiveEvent com.vaadin.event.EventRouter.fireEventで(ListenerMethod.java:510) (EventRouter.java:164)

...によって引き起こさ

:javaの。 com.vaadin.ui.AbstractComponentContainer.addComponentでcom.vaadin.ui.CustomComponent.removeComponent(CustomComponent.java:248) でlang.UnsupportedOperationException (AbstractComponentContainer.java:207)

...

一方、私がsetCompとsetCompの間で切り替えるとositionRoot(レイアウト)とmyWindow.addComponent(レイアウト)を使用すると、ラベルとボタンは、新しく作成されたサブウィンドウの代わりにメインウィンドウで終了します。

私には何が欠けていますか?

答えて

3

CustomLayoutを経由するよりも、Windowを直接拡張することをお勧めします。レイアウトにはウィンドウを含めることはできません。

変更

  • 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);

これはメインウィンドウを作成するのとまったく同じ方法でサブウィンドウを作成する標準的な方法です。をクラス外に移動して、メインウィンドウオブジェクトをサブウィンドウに渡さないようにします。サブウィンドウオブジェクトはサブウィンドウオブジェクトの一部ではないためです。

+1

応答のためにありがとう、今は魅力のように動作します。同じ種類の問題を抱えている人には、[Sub windows](http://vaadin.com/tutorial/-chapter/skeleton.subwindows.html)に関する良いチュートリアルがあります。 –