gpt4 book ai didi

gwt - 如何在包含的复合对象上公开来自子对象的事件?

转载 作者:行者123 更新时间:2023-12-04 06:16:52 26 4
gpt4 key购买 nike

我有一个复合小部件,其中包含许多按钮(例如 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() .当您像这样公开您的按钮时,问题是不再需要复合 Material 上的直通方法,因为他/她无论如何都可以直接访问按钮,从而使上述将目标按钮作为参数的方法已过时。最糟糕的是他/她甚至可以更改样式甚至分离这些按钮。

要解决这个问题,您可以在 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) {
...
}
});

关于gwt - 如何在包含的复合对象上公开来自子对象的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com