如何在包含复合对象的子对象上公开事件



我有一个包含许多按钮的复合小部件(例如: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方法,因为他/她可以直接访问按钮,从而使上述以目标按钮作为参数的方法过时。最糟糕的是,他/她甚至可以改变样式,甚至拆下那些按钮。

为了解决这个问题,你可以通过HasClickHandlers接口公开你的按钮。

所以恕我直言,我认为应该这样做:

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) {
        ...
    }
});

相关内容

  • 没有找到相关文章

最新更新