对不起,如果这是一个愚蠢的问题,但我刚刚开始学习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无法正常工作。默认值(“World”)未显示,按钮没有反应,没有System.out消息......
但onModuleLoad()中定义的Button效果很好,我不知道为什么......有人可以告诉我哪里出错了吗?非常感谢!
另一个问题:
RootPanel.get().add(helloWorldPanel);
和RootPanel.getBodyElement().appendChild(helloWorldPanel.getElement());
之间有什么区别?看来也是一样的结果......
答案 0 :(得分:4)
您不必(或更确切地说:您不能)实例化使用@UiField
注释的小部件 - UiBinder会为您执行此操作。因此,在您的代码中,您放弃这些窗口小部件并创建自己的窗口小部件 - 但由于它们未添加到DOM中,因此它们不会接收DOM事件。删除nameTextBox = new TextBox();
和goButton = new Button("Go");
行,您应该没问题:)
PS:如果您需要创建包含一些自定义参数的Widget,请参阅good docs。