GWT事件处理最佳实践

时间:2011-07-29 16:05:25

标签: java model-view-controller events gwt handlers

我对界面设计很陌生,并努力弄清楚处理事件的最佳方法是什么。在处理程序的简单情况和(在这种情况下)按钮导致事件在同一个类中,这没关系,我明白了。处理程序可以看到按钮,以便它可以说:

if (event.getSource() == myButton)

并且,处理程序位于同一个类中,因此它可以将选项卡添加到该类的本地对象或类似对象。

问题:当处理程序和事件生成器位于不同的类中时,我不知道应该如何处理这种情况。

e.g。

从我的主布局类中,我创建并显示自定义对话框。该对话框在其自己的类中实现。理想情况下,对话框将使用主布局类中的处理程序(它实现ClickHandler),这很好,但我的应用程序有一些不同的ClickEvent。我通过检查来源来区分它们。在这种情况下,按钮位于对话框类中,所以我不能简单地说:

if (event.getSource() == myDialogbutton)

因为myDialogBu​​tton不在范围内。

任何有关如何运作的提示都将不胜感激。

d

5 个答案:

答案 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中的按钮。这样他们的生命周期是相互关联的,他们只是互相参照。

  1. 扩展小部件
  2. 给它一个id并将其添加到构造函数[确保id是独一无二的]
  3. 实现侦听器类。
  4. 每次创建相同类型的项目时,都会创建一个新的侦听器实例。
  5. 我猜测有些特定对象连接到小部件。如果是这样的话,请保留一个HashMap。
  6. 愿力量与你同在

答案 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。