Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT事件处理最佳实践_Java_Model View Controller_Events_Gwt_Handlers - Fatal编程技术网

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。我希望事件能够分配唯一的名称,我可以使用。