2

我对界面设计很陌生,并且努力找出处理事件的最佳方式是什么。在处理程序和(在这种情况下)导致事件在同一个类中的按钮的直接情况下,这很好,我明白了。处理程序可以看到按钮,因此它可以说:

if (event.getSource() == myButton)

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

问题:我不知道应该如何处理处理程序和事件生成器在不同类中的情况。

例如

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

if (event.getSource() == myDialogbutton)

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

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

D

4

5 回答 5

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();
        ...
    }
}

我使用此类将整数或其他参数等参数传递给 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 以及我需要向其传递数据的所有其他内容,我也执行相同的操作。

希望这对您有所帮助。

于 2011-07-29T17:37:13.620 回答
1

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

一般来说,您应该尝试为每个函数设置一个侦听器,而不是每个“事件生成器”设置一个侦听器。

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

它将用于将组件彼此分开。

于 2013-01-14T14:51:34.467 回答
1

尝试为每个匿名或串行小部件(例如 FlexTable 中的按钮)创建一个新的侦听器。这样,它们的生命周期是相互关联的,并且它们只相互引用。

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

愿原力与你同在

于 2013-07-13T02:58:39.710 回答
1

首先我建议你尝试在同一个类中收集你的按钮和它们的 ClickHandlers,但如果你的情况是不可能的,我有一个建议给你:

当您创建 Button 时,您可以向它们添加一些信息:

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

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

Button button = (Button) event.getSource();
MetaData someObj = (MetaData) button.getLayoutData(); 
于 2013-01-14T17:17:08.223 回答
0

你不能这样做:

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

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

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

于 2013-08-09T21:22:08.520 回答