2012-09-10 33 views
2

我正在GWT中設計一個簡單的應用程序,並在客戶端有不同的意見。每個視圖都從SimplePanel擴展而來,並將根據需要添加到RootPanel中。爲什麼我不能添加一個從SimplePanel擴展到RootPanel的類?

我的第一個觀點是登錄類:

public class Login extends SimplePanel 
{ 
    private final TextBox txt_login; 
    private final PasswordTextBox txt_password; 
    private final Button btn_login; 
    private final Grid main_grid; 

    Login() 
    { 
     super(); 

     txt_login=new TextBox(); 
     txt_password=new PasswordTextBox(); 
     btn_login=new Button("Login"); 
     main_grid=new Grid(3,2); 

     main_grid.setWidget(0, 0, new HTML("Login")); 
     main_grid.setWidget(1, 0, new HTML("Password")); 
     main_grid.setWidget(0, 1, txt_login); 
     main_grid.setWidget(1, 1, txt_password); 
     main_grid.setWidget(2, 1, btn_login); 

     setWidget(main_grid); 
    } 
} 

我嘗試將它與下面的代碼添加到RootPanel在我的入口點類:

Login login_box=new Login(); 
RootPanel.get().add(login_box); 

但我最終得到在運行時出現以下錯誤:

java.lang.NullPointerException: null 
    at com.google.gwt.user.client.ui.AttachDetachException.tryCommand(AttachDetachException.java:72) 
    at com.google.gwt.user.client.ui.Panel.doAttachChildren(Panel.java:170) 
    at com.google.gwt.user.client.ui.Widget.onAttach(Widget.java:345) 
    at com.google.gwt.user.client.ui.Widget.setParent(Widget.java:475) 
    at com.google.gwt.user.client.ui.Panel.adopt(Panel.java:127) 
    at com.google.gwt.user.client.ui.ComplexPanel.add(ComplexPanel.java:97) 
    at com.google.gwt.user.client.ui.AbsolutePanel.add(AbsolutePanel.java:97) 
    at de.enercon.epi.client.Epi.onModuleLoad(Epi.java:15) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:405) 
    at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200) 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526) 
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) 
    at java.lang.Thread.run(Unknown Source) 

奇怪的是我完全能夠得到它的工作,如果我e從DialogBox代替SimplePanel擴展Login類。

什麼可能導致它?

回答

2

我不知道你的問題是什麼,但我會建議,而不是延長CompositeSimplePanel,然後問題應該走開,你會遵循最佳實踐:-) http://googlewebtoolkit.blogspot.com/2009/05/widget-best-practices-widget-building.html

public class Login extends Composite { 
    private final TextBox txt_login; 
    private final PasswordTextBox txt_password; 
    private final Button btn_login; 
    private final Grid main_grid; 

    Login() { 
    txt_login = new TextBox(); 
    txt_password = new PasswordTextBox(); 
    btn_login = new Button("Login"); 
    main_grid = new Grid(3, 2); 

    main_grid.setWidget(0, 0, new HTML("Login")); 
    main_grid.setWidget(1, 0, new HTML("Password")); 
    main_grid.setWidget(0, 1, txt_login); 
    main_grid.setWidget(1, 1, txt_password); 
    main_grid.setWidget(2, 1, btn_login); 

    initWidget(main_grid); 
    } 
} 
+0

「該組合對於從單個面板中包含的多個其他小部件的聚合中創建單個小部件很有用。」 太棒了!它的工作原理正是我所需要的:D – Kovags

2

簡單面板可能只接受一個子窗口小部件。您無法將其擴展爲包含多個小部件。

最好的做法是將一個Composite或LayoutPanel添加到RootPanel--這是您的「應用程序」,您可以根據需要設置應用程序的大小和樣式。然後,您擴展Composite以創建「視圖」,並在用戶瀏覽您的應用程序時刪除視圖並將其添加到「應用程序」。

+0

「SimplePanel」不只有一個子部件,「Grid」嗎? –

+0

它可以接受一個小部件作爲一個孩子。它可以是任何小部件。 –

相關問題