我有一个包含许多按钮的复合小部件(例如:Button1, Button2等)。我不知道如何在复合小部件上公开按钮单击事件。我试图避免创建自定义事件,如Button1ClickEvent和Button2ClickEvent,而是为它们重用现有的GWT ClickEvent。下面的代码片段可以让您了解我正在尝试做什么:
public class WidgetWithTwoButtons extends Composite {
...
@UiField Button button1;
@UiField Button button2;
@UiHandler("button1")
void onButton1Click(ClickEvent event) {
// TODO fire click event on Button1ClickHandler
}
public HandlerRegistration addButton1ClickHandler(ClickHandler handler) {
return addDomHandler(handler, ClickEvent.getType());
}
@UiHandler("button2")
void onButton1Click(ClickEvent event) {
// TODO fire click event on Button2ClickHandler
}
public HandlerRegistration addButton2ClickHandler(ClickHandler handler) {
return addDomHandler(handler, ClickEvent.getType());
}
}
我认为这不是最好的做法。如果你在你的答案中给出建议的解决方案/例子,我将不胜感激。谢谢!
我开始思考你的问题,并首先注意到,而不是使用addDomHandler
,你可以改变你当前的addButton1ClickHandler(ClickHandler handler)
简单地:
public HandlerRegistration addButton1ClickHandler(ClickHandler handler) {
return button1.addClickHandler(handler);
}
如果您只有一个按钮,您可以通过让Composite实现HasClickHandlers并实现下面的方法将其传递给按钮来公开它:
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return button1.addClickHandler(handler);
}
但是,由于您有许多按钮,您需要一个方法,将您想要添加clickHandler的按钮作为参数,例如:
public HandlerRegistration addClickHandlerToButton(ClickHandler handler, Button target){
return target.addClickHandler(handler);
}
这种方法的问题是,要使用它,你需要有一个对按钮的引用,这意味着你需要在你的组合中为按钮定义getter方法,比如public Button getButton1()
。当您像这样公开按钮时,问题是不再需要复合上的passthrough方法,因为他/她可以直接访问按钮,从而使上述以目标按钮作为参数的方法过时。最糟糕的是,他/她甚至可以改变样式,甚至拆下那些按钮。
所以恕我直言,我认为应该这样做:
public class ComplexComposite extends Composite {
private Button button1 = new Button("btn1");
private Button button2 = new Button("btn2");
public ComplexComposite(){
HorizontalPanel panel = new HorizontalPanel();
panel.add(button1);
panel.add(button2);
initWidget(panel);
}
public HasClickHandlers getButton1(){
return button1;
}
public HasClickHandlers getButton2(){
return button2;
}
}
使用这种方法,您只在所需的接口上公开按钮,并且可以添加单击处理程序,如:
ComplexComposite composite = new ComplexComposite();
composite.getButton1().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
...
}
});