Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java事件-如何向其发送额外信息?_Java_Events - Fatal编程技术网

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

Java事件-如何向其发送额外信息?,java,events,Java,Events,我是一名C#开发人员,但目前正在从事Java工作。在C#中,事件有两个参数:eventArgs(关于事件本身的信息)和sender(关于触发事件的对象的信息) Java的方法稍有不同,每个事件处理程序都是一个类(嵌套或非嵌套)。由于代码整洁,我决定不创建嵌套类。 发生的情况是,我遇到了问题,因为我无法访问有关触发此事件的对象的某些信息,也无法访问类的某些元素(可能对计算有用的其他对象) 我如何解决这两个问题 谢谢, OscarJava中的事件不是一种特殊的语言功能,因此您可以随意设计事件类,只要

我是一名C#开发人员,但目前正在从事Java工作。在C#中,事件有两个参数:eventArgs(关于事件本身的信息)和sender(关于触发事件的对象的信息)

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

我如何解决这两个问题

谢谢, Oscar

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();
}
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?但将对象实例传递给构造函数可能更简单。将引用传递给事件处理程序的构造函数是一个聪明的想法,谢谢!将引用传递给事件处理程序的构造函数是一个聪明的想法,谢谢!