繁体   English   中英

GWT事件处理最佳实践

[英]GWT Event Handling best practice

我是界面设计的新手,正在努力弄清楚处理事件的最佳方法是什么。 在处理程序和按钮(在这种情况下)直接导致事件在同一类中的情况下,我明白了。 处理程序可以看到按钮,以便可以说:

if (event.getSource() == myButton)

而且,处理程序在同一类中,因此它可以将制表符添加到该类或类似对象本地的对象中。

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

例如

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

if (event.getSource() == myDialogbutton)

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

任何提示这应该如何工作将不胜感激。

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;
    }
}

现在,如果有一个按钮:

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,命令以及将数据传递到的所有其他操作,我也都执行相同的操作。

希望这对您有所帮助。

在我看来,您正在尝试将一个侦听器用于多个按钮,除非多个按钮具有相同的功能,而它们应该具有不同的侦听器。

通常,您应该尝试每个函数有一个侦听器,而不是每个“事件生成器”有一个侦听器。

例如,如果有注销按钮,则它可能有一个来自LoginStatusWidget的侦听器(显示客户端的登录用户)和一个负责通知注销服务器的对象的侦听器。

它将使各个组件彼此分离。

尝试为每个匿名或串行窗口小部件(例如FlexTable中的按钮)创建一个新的侦听器。 这样一来,他们的生命周期就相互关联,而且彼此之间只能互相参照。

  1. 扩展小部件
  2. 给它一个ID并将其添加到构造函数中[确保ID是一种类型]
  3. 实现侦听器类。
  4. 每次创建相同种类的项目时,都要创建一个新的侦听器实例。
  5. 我猜有特定的对象连接到小部件。 如果是这样,请保留一个HashMap。

愿原力与你同在

首先,我建议您尝试将按钮及其ClickHandlers收集在同一类中,但是如果您的情况不可行,我建议您:

创建按钮时,可以向其中添加一些信息:

Button button = new Button("submit");
button.setLayoutData(someObj);

然后在触发事件之后,您可以从ClickHandler中的事件中获取Button,然后找出它是哪个按钮:

Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData(); 

你不能只是做:

final Button source= new Button("My Button");

button.addClickHandler(new ClickHandler() {
   @Override
   public void onClick(ClickEvent event) {
         doSomething(source);
   }
}

请注意,按钮实例必须标记为final。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM