2

私はGWTで単純なアプリケーションを設計しており、クライアント側でさまざまなビューを持っています。各ビューはSimplePanelから拡張され、必要に応じてRootPanelに追加されます。

私の最初のビューはLoginクラスです。

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)

不思議なことに、SimplePanelではなくDialogBoxからLoginクラスを拡張すれば、完全に機能させることができます。

何が原因でしょうか?

4

2 に答える 2

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);
  }
}
于 2012-09-10T16:32:49.557 に答える
2

単純なパネルは、1つの子ウィジェットのみを受け入れることができます。複数のウィジェットを含めるように拡張することはできません。

ベストプラクティスは、CompositeまたはLayoutPanelをRootPanelに追加することです。これは「アプリ」であり、アプリの外観に合わせてサイズとスタイルを設定できます。次に、Compositeを拡張して「ビュー」を作成し、ユーザーがアプリをナビゲートするときに、ビューを削除して「アプリ」に追加します。

于 2012-09-10T16:55:29.510 に答える