Java事件-如何向其发送额外信息?
我是一名C#开发人员,但目前正在从事Java工作。在C#中,事件有两个参数:eventArgs(关于事件本身的信息)和sender(关于触发事件的对象的信息) Java的方法稍有不同,每个事件处理程序都是一个类(嵌套或非嵌套)。由于代码整洁,我决定不创建嵌套类。 发生的情况是,我遇到了问题,因为我无法访问有关触发此事件的对象的某些信息,也无法访问类的某些元素(可能对计算有用的其他对象) 我如何解决这两个问题 谢谢, OscarJava中的事件不是一种特殊的语言功能,因此您可以随意设计事件类,只要您不必使用特定框架或库中的给定事件类即可 如果您想让一个事件知道它的创建者,您可以这样编码:Java事件-如何向其发送额外信息?,java,events,Java,Events,我是一名C#开发人员,但目前正在从事Java工作。在C#中,事件有两个参数:eventArgs(关于事件本身的信息)和sender(关于触发事件的对象的信息) Java的方法稍有不同,每个事件处理程序都是一个类(嵌套或非嵌套)。由于代码整洁,我决定不创建嵌套类。 发生的情况是,我遇到了问题,因为我无法访问有关触发此事件的对象的某些信息,也无法访问类的某些元素(可能对计算有用的其他对象) 我如何解决这两个问题 谢谢, OscarJava中的事件不是一种特殊的语言功能,因此您可以随意设计事件类,只要
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));
}
}
我会给你按钮。按钮再次知道它的“容器”,通常是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();
}
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));
}
}
我会给你按钮。按钮再次知道它的“容器”,通常是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();
}
第二个问题可以通过返回嵌套类(与C#不同,Java中的嵌套类可以访问外部类的字段,包括非静态字段和私有字段)或通过向事件处理程序的构造函数传递适当的引用来解决(如果在处理事件时希望访问单个对象)。第二个问题可以通过返回嵌套类来解决(与C#不同,Java中的嵌套类可以访问外部类的字段,包括非静态字段和私有字段)或者通过将适当的引用传递给事件处理程序的构造函数(如果它是处理事件时您希望访问的单个对象)。是的,这基本上就是观察者模式,对吗?但我希望在“单击按钮”中包含此信息事件,所以我不想重新编程所有内容:(但无论如何还是要感谢:)@Oscar-非常确定,您指的是Java中的AWT或SWING框架。它们提供了observer模式的实现,就像其他框架(SWT,…),但事件类型可能不同。请告诉您实际使用的框架,我们可能会提供更好的帮助。据我所知(我对Java非常陌生)我正在使用Swing实现。我已经使用Observable类和Observer接口在系统的不同部分创建了一个Observable模式。我可以创建button的一个子类,该子类引用Observable的一个实例(因为Java中的单一继承约束).对吗?但可能将对象的实例传递给构造函数是一种更简单的方法。是的,这基本上是观察者模式,对吗?但我希望在“单击按钮”事件中获得这些信息,因此我不希望必须重新编程所有内容:(但无论如何,谢谢:)@Oscar-非常确定,您指的是Java中的AWT或SWING框架。它们提供了observer模式的实现,就像其他框架(SWT,…)一样,但事件类型可能不同。请告诉您实际使用的框架,我们可能会提供更好的帮助。据我所知(我对Java非常陌生)我正在使用Swing实现。我已经使用Observable类和Observer接口在系统的不同部分创建了一个Observable模式。我可以创建button的一个子类,该子类引用Observable的一个实例(因为Java中的单一继承约束).Correct?但将对象实例传递给构造函数可能更简单。将引用传递给事件处理程序的构造函数是一个聪明的想法,谢谢!将引用传递给事件处理程序的构造函数是一个聪明的想法,谢谢!