Java GWT事件处理最佳实践
我对界面设计还很陌生,正在努力找出处理事件的最佳方式。在处理程序和(在本例中)按钮导致事件在同一个类中的直接情况下,我明白了。处理程序可以看到按钮,因此可以说:Java GWT事件处理最佳实践,java,model-view-controller,events,gwt,handlers,Java,Model View Controller,Events,Gwt,Handlers,我对界面设计还很陌生,正在努力找出处理事件的最佳方式。在处理程序和(在本例中)按钮导致事件在同一个类中的直接情况下,我明白了。处理程序可以看到按钮,因此可以说: if (event.getSource() == myButton) 而且,处理程序也在同一个类中,因此它可以向该类或类似类的本地对象添加选项卡 问题:当处理程序和事件生成器在不同的类中时,我不知道应该如何处理这种情况 e、 g 我从主布局类创建并显示一个自定义对话框。该对话框在其自己的类中实现。理想情况下,dialog将使用主布局类
if (event.getSource() == myButton)
而且,处理程序也在同一个类中,因此它可以向该类或类似类的本地对象添加选项卡
问题:当处理程序和事件生成器在不同的类中时,我不知道应该如何处理这种情况
e、 g
我从主布局类创建并显示一个自定义对话框。该对话框在其自己的类中实现。理想情况下,dialog将使用主布局类中的处理程序(它实现ClickHandler),这很好,但我的应用程序有几个不同的ClickEvents。如上所述,我通过检查来源来区分它们。在这种情况下,按钮位于dialog类中,因此我不能简单地说:
if (event.getSource() == myDialogbutton)
因为myDialogButton不在范围内
任何关于如何工作的提示都将不胜感激
D也许我能帮你解决我的问题 我将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;
}
}
import com.google.gwt.event.dom.client.ClickHandler;
公共抽象类ClickHandler数据实现ClickHandler{
私有T数据;
公共ClickHandlerData(T数据)
{
这个数据=数据;
}
公共T getData()
{
返回数据;
}
公共无效设置数据(T数据)
{
这个数据=数据;
}
}
现在,如果是按钮:
Button btn = new Button("click me");
btn.addClickHandler(new ClickHandlerData<Button>(btn)) {
public void onClick(ClickEvent event) {
Button btn = getData();
...
}
}
按钮btn=新建按钮(“单击我”);
添加ClickHandler(新的ClickHandlerData(btn)){
公共作废一次点击(点击事件){
按钮btn=getData();
...
}
}
我使用这个类将整数等参数传递给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());
...
}
}
}
for(int i=0;i在我看来,您试图将一个侦听器用于多个按钮,除非几个按钮具有相同的功能,否则它们应该具有不同的侦听器
通常,您应该尝试为每个函数设置一个侦听器,而不是为每个“事件生成器”设置一个侦听器
例如,如果您有一个注销按钮,它可能有一个来自LoginStatusWidget的侦听器(显示客户端登录的身份)和一个来自负责记录注销服务器的对象的侦听器
它将用于将组件彼此分离。首先,我建议您尝试在同一类中收集按钮及其ClickHandler,但如果您的情况不可能,我建议您:
创建按钮时,您可以向其添加一些信息:
Button button = new Button("submit");
button.setLayoutData(someObj);
然后在触发事件后,您可以从ClickHandler中的事件中获取按钮,并找出它是哪个按钮:
Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData();
尝试为每个匿名或串行小部件创建一个新的侦听器,例如FlexTable中的按钮。这样,它们的生命周期就连接起来了,它们只相互引用
扩展小部件
给它一个id并将其添加到构造函数中[确保该id是同一类型的]
实现侦听器类
每次创建相同类型的项时,都要创建侦听器的新实例
我猜有特定的对象连接到小部件。如果是这样,请保留一个HashMap
愿原力与你同在你就不能:
final Button source= new Button("My Button");
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doSomething(source);
}
}
注意,按钮实例必须标记为final。谢谢,但这并不能真正帮助我,因为基本问题仍然存在。作为对象B成员的按钮无法与event.getSource()进行比较在对象A的click handler实现中。我唯一能想到的是将对对象A的引用传递给对象B,然后在对象A中引入一个方法,我从对象B调用该方法,该对象B现在也实现ClickHandler。我希望事件能够分配唯一的名称,我可以使用。