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

时间:2010-12-13 13:22:53

标签: java events

我是C#dev但目前正在开发Java。在C#中,事件有两个参数:eventArgs - 有关事件iself的信息 - 和sender,它是有关触发事件的对象的信息。

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

我如何解决这两个问题?

谢谢, 奥斯卡

2 个答案:

答案 0 :(得分:4)

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;}
}

并像这样开火:

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

(假设,this是虚构Sender类的一个实例,并且您有一个带有监听器的集合,用于您的活动)


JButton向所有已注册的ActionEvent发送ActionListeners。此事件的构造函数采用sender,这是导致事件的按钮对象。它提供了getSource()方法来从事件中获取它,所以

if (event.getSource() instanceof JButton) {
   JButton sender = (JButton) event.getSource();
}

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

另一个技巧是,如果你想知道包含按钮的对话框,那就是扩展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;}
}

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

if (event.getSource() instanceof MyJButton) {
   Window window = ((MyJButton) event.getSource()).getParentWindow();
}

答案 1 :(得分:1)

通过回到嵌套类(与C#不同,Java中的嵌套类可以访问外部类的字段,包括非静态字段和私有字段)或者通过向构造函数传递适当的引用来解决第二个问题。一个事件处理程序(如果它是您在处理事件时想要访问的单个对象)。