2011-07-29 131 views
2

我对界面设计相当陌生,并且很难找出处理事件的最佳方式。在处理程序和(在这种情况下)按钮导致事件在同一个类中的简单情况下,这很好,我明白了。该处理器可以看到的按钮,这样就可以说:GWT事件处理最佳实践

if (event.getSource() == myButton) 

而且,该处理器是在同一类,所以它可以添加标签到对象局部的类或类似。

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

例如

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

if (event.getSource() == myDialogbutton) 

as myDialogBu​​tton不在范围内。

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

d

回答

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一样的,命令,一切我需要将数据传递到。

希望这对你有所帮助。

+0

谢谢,但这并不能真正帮助我解决问题。作为对象B的成员的按钮无法与对象A的Click处理器实现中的event.getSource()进行比较。我能做的唯一事情就是将对象A的引用传递给对象B,然后在对象A中引入一个方法,我从对象B调用它,该对象现在也实现了ClickHandler。我希望事件能够分配我可以使用的独特名称。 – dpwr

1

在我看来,你正在试图为多个按钮使用一个侦听器,除非几个按钮具有相同的功能,他们应该有不同的侦听器。

一般而言,您应该尝试为每个函数使用一个侦听器,而不是每个“事件生成器”使用一个侦听器。

如果您有例如一个注销按钮,它可能会有一个来自LoginStatusWidget的监听器(显示客户端的登录身份)以及来自可注销注销服务器响应对象的监听器。

这将有助于分离彼此的组件。

0

起初,我建议您尝试收集您的按钮及其ClickHandlers在同一个班,但如果你的情况是不可能的,我有一个建议给你:

当你创建你的按钮你可以添加一些信息对他们说:

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

然后点火事件后,你可以从事件得到您的按钮在你的clickHandler事件,并找出是哪个按钮:

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

尝试为每个匿名或连续小部件创建一个新侦听器,例如FlexTable中的按钮。这样他们的生命周期就连接起来了,它们只能互相引用。

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

愿力量与你同在

0

你就不能这样做:

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

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

注按钮实例必须被标记为final。