Определенные в UiBinder события не работают? - PullRequest
1 голос
/ 16 июля 2010

Извините, если это глупый вопрос, но я только начинаю изучать 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>

Это оченьБазовый «Композитный» виджет, но TextBox и Button в HelloWorldPanel просто не работают.Значение по умолчанию («Мир») не отображается, и кнопка не реагирует, нет сообщения System.out ...

Но кнопка, определенная в onModuleLoad (), работает просто хорошо, я не знаю, почему.... Может кто-нибудь сказать мне, где идет не так?Большое спасибо!

Еще один вопрос: в чем разница между RootPanel.get().add(helloWorldPanel); и RootPanel.getBodyElement().appendChild(helloWorldPanel.getElement());?Кажется, тот же результат ...

1 Ответ

4 голосов
/ 16 июля 2010

Вам не нужно (или, если быть более точным: , вы не должны ) создавать экземпляры виджетов, помеченных @UiField - UiBinder сделает это за вас.Итак, в своем коде вы отбрасываете эти виджеты и создаете свои собственные - но поскольку они не добавляются в DOM, они не получают события DOM.Удалите строки nameTextBox = new TextBox(); и goButton = new Button("Go");, и все будет в порядке:)

PS: Если вам нужно создать виджет с некоторыми пользовательскими параметрами, см. хорошие документы .

...