1

对不起,如果这是一个愚蠢的问题,但我刚刚开始学习 GWT 并且很长一段时间都陷入了这个问题...... 这是我的代码:

public void onModuleLoad() {

    HelloWorldPanel helloWorldPanel = new HelloWorldPanel();
    RootPanel.get().add(helloWorldPanel);
    //RootPanel.getBodyElement().appendChild(helloWorldPanel.getElement());

    Button b = new Button();
    b.setText("button B");
    b.addClickHandler(new ClickHandler()
    {
      @Override
      public void onClick(ClickEvent arg0)
      {
        System.out.println("click B");
        Window.alert("Hello button B");
      }
    });
    RootPanel.get().add(b);
}

这是我的 HelloWorldPanel.java :

public class HelloWorldPanel extends Composite
{
  interface HelloWorldUiBinder extends UiBinder<Widget , HelloWorldPanel> {}

  private static HelloWorldUiBinder uiBinder = GWT.create(HelloWorldUiBinder.class);

  @UiField TextBox nameTextBox;

  @UiField Button goButton;

  public HelloWorldPanel()
  {
    initWidget(uiBinder.createAndBindUi(this));

    nameTextBox = new TextBox();
    nameTextBox.setText("World");

    goButton = new Button("Go");
    goButton.addClickHandler(new ClickHandler()
    {
      @Override
      public void onClick(ClickEvent event)
      {
        System.out.println("clicked , event = " + event);
        Window.alert("Hello " + nameTextBox.getValue());
      }
    });
  }
}

和 HelloWorldPanel.ui.xml :

<ui:UiBinder 
  xmlns:ui="urn:ui:com.google.gwt.uibinder"
  xmlns:g="urn:import:com.google.gwt.user.client.ui">

  <g:HTMLPanel>
    <g:TextBox ui:field="nameTextBox" />
    <g:Button  ui:field="goButton" text="Go"/>
  </g:HTMLPanel>

</ui:UiBinder>

这是一个非常基本的“复合”小部件,但 HelloWorldPanel 中的 TextBox 和 Button 无法正常工作。默认值(“世界”)不显示,按钮没有反应,没有 System.out 消息...

但是 onModuleLoad() 中定义的 Button 效果很好,我不知道为什么....有人可以告诉我哪里出错了吗?非常感谢 !

RootPanel.get().add(helloWorldPanel);另一个问题:和有什么区别RootPanel.getBodyElement().appendChild(helloWorldPanel.getElement());?结果似乎一样...

4

1 回答 1

4

您不必(或者更准确地说:您不能)实例化带有注释的小部件@UiField- UiBinder 会为您做到这一点。因此,在您的代码中,您丢弃这些小部件并创建自己的 - 但由于它们没有添加到 DOM,它们不会接收 DOM 事件。删除nameTextBox = new TextBox();goButton = new Button("Go");线,你应该没事:)

PS:如果您需要创建带有一些自定义参数的 Widget,请参阅良好的文档

于 2010-07-16T18:11:40.817 回答