我对界面设计很陌生,并努力弄清楚处理事件的最佳方法是什么。在处理程序的简单情况和(在这种情况下)按钮导致事件在同一个类中,这没关系,我明白了。处理程序可以看到按钮,以便它可以说:
if (event.getSource() == myButton)
并且,处理程序位于同一个类中,因此它可以将选项卡添加到该类的本地对象或类似对象。
问题:当处理程序和事件生成器位于不同的类中时,我不知道应该如何处理这种情况。
e.g。
从我的主布局类中,我创建并显示自定义对话框。该对话框在其自己的类中实现。理想情况下,对话框将使用主布局类中的处理程序(它实现ClickHandler),这很好,但我的应用程序有一些不同的ClickEvent。我通过检查来源来区分它们。在这种情况下,按钮位于对话框类中,所以我不能简单地说:
if (event.getSource() == myDialogbutton)
因为myDialogButton不在范围内。
任何有关如何运作的提示都将不胜感激。
d
答案 0 :(得分:4)
也许我可以帮助你解决问题...
我将ClickHandler继承到一个通用的自己的类。您可以为ClickHandler提供您想要的任何类型的对象,并且可以从该方法中访问它。
示例:
import com.google.gwt.event.dom.client.ClickHandler;
public abstract class ClickHandlerData<T> implements ClickHandler {
private T data;
public ClickHandlerData(T data)
{
this.data = data;
}
public T getData()
{
return data;
}
public void setData(T data)
{
this.data = data;
}
}
现在,如果是按钮:
Button btn = new Button("click me");
btn.addClickHandler(new ClickHandlerData<Button>(btn)) {
public void onClick(ClickEvent event) {
Button btn = getData();
...
}
}
我使用此类将参数(如Integers或其他参数)传递给ClickHandler。例如:
for (int i=0;i<10;i++)
{
Button btn = new Button("click me");
btn.addClickHandler(new ClickHandlerData<Integer>(i)) {
public void onClick(ClickEvent event) {
Window.alert("you klicked button "+getData());
...
}
}
}
我也为AsyncCallbacks,Commands,以及我需要传递数据的其他所有内容做同样的事情。
希望这对你有所帮助。
答案 1 :(得分:1)
在我看来,你试图为一个多个按钮使用一个监听器,除非有几个按钮具有相同的功能,它们应该有不同的监听器。
一般来说,你应该尝试为每个函数设置一个监听器,而不是每个“事件生成器”都有一个监听器。
如果你有一个注销按钮,它可能有一个来自LoginStatusWidget的监听器(显示客户端登录的对象)和一个负责注释注销服务器的对象的监听器。
它将用于将组件彼此分开。
答案 2 :(得分:1)
尝试为每个匿名或串行小部件创建一个新的侦听器,例如FlexTable中的按钮。这样他们的生命周期是相互关联的,他们只是互相参照。
愿力量与你同在
答案 3 :(得分:0)
首先,我建议您尝试在同一个班级中收集您的按钮及其ClickHandler,但如果您的情况不可行,我建议您:
创建按钮时,可以向其添加一些信息:
Button button = new Button("submit");
button.setLayoutData(someObj);
然后在触发事件后,您可以在ClickHandler中从事件中获取Button,并找出它是哪个按钮:
Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData();
答案 4 :(得分:0)
你不能这样做:
final Button source= new Button("My Button");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doSomething(source);
}
}
请注意,按钮实例必须标记为final。