我是C#dev但目前正在开发Java。在C#中,事件有两个参数:eventArgs - 有关事件iself的信息 - 和sender,它是有关触发事件的对象的信息。
Java的方法略有不同,每个事件处理程序都是一个类(嵌套或不嵌套)。由于代码清洁,我决定创建非嵌套类。 会发生什么事情,因为我无法访问有关触发此事件的对象的某些信息,也无法访问该类的某些元素(其他可能的对象)对计算有用。)
我如何解决这两个问题?
谢谢, 奥斯卡
答案 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();
}
实际上会给你按钮。该按钮再次知道其“容器”,通常是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;}
}
将此类用于按钮,并将上面的代码段更改为:
if (event.getSource() instanceof MyJButton) {
Window window = ((MyJButton) event.getSource()).getParentWindow();
}
答案 1 :(得分:1)
通过回到嵌套类(与C#不同,Java中的嵌套类可以访问外部类的字段,包括非静态字段和私有字段)或者通过向构造函数传递适当的引用来解决第二个问题。一个事件处理程序(如果它是您在处理事件时想要访问的单个对象)。