2012-09-10 82 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

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

相关问题