Java 事件 - 如何向其发送额外信息?

JSB*_*ach 1 java events

我是一名 C# 开发人员,但目前正在研究 Java。在 C# 中,事件有两个参数:eventArgs - 关于事件本身的信息 - 和发送者,它是关于触发事件的对象的信息。

Java 的方法略有不同,每个事件处理程序都是一个类(嵌套与否)。由于代码整洁,我决定创建非嵌套类。发生的情况是我遇到了问题,因为我无法访问有关触发此事件的对象的某些信息,也无法访问类的某些元素(可能对计算有用的其他对象)。

我该如何解决这两个问题?

谢谢,奥斯卡

And*_*s_D 5

Java 中的事件不是一种特殊的语言特性,因此您可以随意设计您喜欢的事件类 - 只要您不必使用来自某个框架或库的给定事件类。

如果你想让一个事件知道它的创建者,你可以这样编码:

public class Event<T> {
  private T sender;
  private String message;
  public Event(T sender, String message) {
    this.sender = sender;
    this.message = message;
  }
  public T getSender(){return sender;}
  public String getMessage(){return message;}
}
Run Code Online (Sandbox Code Playgroud)

并像这样启动它:

private void fire(String message) {
  for(Listener listener:listeners) {
    listener.notify(new Event<Sender>(this, message));
  }
}
Run Code Online (Sandbox Code Playgroud)

(假设,this是虚构Sender类的一个实例,并且您有一个包含事件监听器的集合)


AJButtonActionEvent所有注册的ActionListeners. 此事件的构造函数采用sender,它是引发事件的按钮对象。它提供了getSource()一种从事件中获取它的方法,因此

if (event.getSource() instanceof JButton) {
   JButton sender = (JButton) event.getSource();
}
Run Code Online (Sandbox Code Playgroud)

实际上会给你按钮。该按钮再次知道它的“容器”,通常是一个JPanel. getParent()是从按钮(或任何其他组件)实际获取它的方法。

另一个技巧,如果您想知道包含按钮的对话框,则扩展JButton并添加自定义parentWindow字段:

public class MyJButton extends JButton {
  private Window parentWindow = null;

  public MyJButton(Window parentWindow, String text) {
    super(text); // call the JButton constructor!!
    this.parentWindow = parentWindow;
  }
  // add all other constructors

  public getParentWindow() {return parent.Window;}
}
Run Code Online (Sandbox Code Playgroud)

将此类用于您的按钮并将上面的代码段更改为:

if (event.getSource() instanceof MyJButton) {
   Window window = ((MyJButton) event.getSource()).getParentWindow();
}
Run Code Online (Sandbox Code Playgroud)