我正在GWT中设计一个简单的应用程序,并在客户端有不同的视图。每个视图都从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)
奇怪的是,如果我从DialogBox而不是SimplePanel扩展Login类,我完全能够正常工作。
可能导致什么原因?
答案 0 :(得分:2)
我不确定您的问题是什么,但我建议延长Composite
而不是SimplePanel
,然后问题应该消失,您将遵循最佳做法:-) 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);
}
}
答案 1 :(得分:2)
简单面板可能只接受一个子窗口小部件。您无法扩展它以包含多个小部件。
最佳做法是将复合或LayoutPanel添加到RootPanel - 这是您的“应用”,您可以根据需要查看应用的大小和样式。然后,您可以扩展Composite以创建“视图”,并在用户导航您的应用时删除视图并将其添加到“app”。