【问题标题】:Extending ActionEvent? A custom event, without a custom listener?扩展 ActionEvent?没有自定义侦听器的自定义事件?
【发布时间】:2017-06-15 04:46:16
【问题描述】:

我现在关心 2 个对象:一个控制器和一个创建事件的类。

我已经在源类中使用了一个 ActionListener 变量,由控制器中的匿名 ActionListener 对象和方法设置。

但我需要访问控制器中源类的数据。我能够扩展 EventListener 并使用自定义 EventObject,但这对于一点数据来说似乎有点矫枉过正。

有没有一种简单的方法来扩展 ActionEvent 并创建一个我可以在侦听器的 actionPerformed() 方法中访问的额外变量? ActionEvent 的构造函数只是让我感到困惑。

public class NotesEvent extends ActionEvent{
    public NotesEvent(Object source, int id, String command){
        super(source, id, command);
    }
}

我不知道在实例化事件时为“标识符”传递什么。

也许我错过了一些简单的事情 - 我只是在很长一段时间内真正学会了使用自定义类来做到这一点。

任何帮助将不胜感激

【问题讨论】:

  • 更具体的解释和minimal reproducible example 代码可能会极大地帮助我们更好地理解您的问题和您的代码。
  • 现在添加一个
  • 是否需要自定义事件类?听起来您可以将常规 ActionEvent 的源转换为您已经知道源的任何类型,然后直接访问其数据。
  • 我不完全确定 - 现在我认为我已经解决了这个问题:我没有降低 ActionEvent 子类。但我很想知道我是否以一种明智的方式做到了这一点(在尝试使事情松散耦合时尽可能明智)。我把代码放在下面
  • 好吧,你可以,但是ActionListener#actionPerformed 仍然会得到ActionListener 的实例 - 所以你遇到了你的代码不是“自我记录”的问题,因为其他人怎么想要知道他们需要转换ActionListener 的实例。 idActionEvent.ACTION_FIRSTActionEvent.ACTION_LASTActionEvent.ACTION_PERFORMED 之一——请查看 JavaDocs 中的描述。我的直觉是考虑自定义侦听器/事件对象,这样就可以更容易理解 API 的意图,而无需“猜测”

标签: java swing


【解决方案1】:

我犯了一个错误,没有在控制器中向下转换自定义事件,所以我认为 ActionListener 不能很好地处理自定义事件 - 但它似乎确实如此(这是我最初的想法)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class Target {
    ActionListener listener;
    int data = 1;

    public Target(){
        JButton b = new JButton("Press Me");

        b.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                CustomEvent ce = new CustomEvent(data, Target.this, 0, "Command");
                if(listener != null) listener.actionPerformed(ce);
            }
        });
    }

    public void setListener(ActionListener listener){
        listener = listener;
    }  
}

class CustomEvent extends ActionEvent{
    int data;
    CustomEvent(int data, Object source, int id, String command){
        super(source, id, command);
        this.data = data;
    }

    public int getData(){
        return data;
    }
}

控制器类:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class Controller {
    Target t = new Target();

    public static void main(String[] args){
        Controller c = new Controller();
    }

    public Controller(){
        t.setListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
               //here was my problem 
               System.out.println(((CustomEvent)e).getID());
            }
        });
    }
}

我仍然不完全确定我应该传递给 ActionEvent 构造函数的数据。

希望以上内容能阐明我想要实现的目标(我知道就 UI 的出现而言它实际上并不完整。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2016-08-11
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多