我是一名 C# 开发人员,但目前正在研究 Java。在 C# 中,事件有两个参数:eventArgs - 关于事件本身的信息 - 和发送者,它是关于触发事件的对象的信息。
Java 的方法略有不同,每个事件处理程序都是一个类(嵌套与否)。由于代码整洁,我决定创建非嵌套类。发生的情况是我遇到了问题,因为我无法访问有关触发此事件的对象的某些信息,也无法访问类的某些元素(可能对计算有用的其他对象)。
我该如何解决这两个问题?
谢谢,奥斯卡
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类的一个实例,并且您有一个包含事件监听器的集合)
AJButton向ActionEvent所有注册的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)
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |