Java链接事件到事件处理程序

Java链接事件到事件处理程序,java,events,Java,Events,我正在为我的游戏开发一个GUI库,我正试图找到一种好方法将GUI元素中的事件(例如按钮中的点击事件)链接到事件处理程序 假设我有一个叫MyButton的按钮。 我将使用以下代码进行设置(不完整,仅供演示): 现在这段代码将在我的一个游戏状态中调用,我想做的事情如下: MyButton.OnClick(MyButtonClickEvent); public void MyButtonClickEvent(EventArgs event) { } public interface Button

我正在为我的游戏开发一个GUI库,我正试图找到一种好方法将GUI元素中的事件(例如按钮中的点击事件)链接到事件处理程序

假设我有一个叫MyButton的按钮。 我将使用以下代码进行设置(不完整,仅供演示):

现在这段代码将在我的一个游戏状态中调用,我想做的事情如下:

MyButton.OnClick(MyButtonClickEvent);

public void MyButtonClickEvent(EventArgs event) {

}
public interface ButtonListener {
    public void OnClick();
}
我的游戏状态、容器和元素的结构如下:

游戏引擎->游戏状态->容器->元素


最接近的解决方案是什么?提前感谢。

Java没有方法作为一级函数,也就是说,该语言不提供可以像在其他语言中一样传递的方法的引用。对于问题中所述的构造,最好使用反射

import java.lang.NoSuchMethodException;
导入java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
导入java.util.Set;
公共类MyButton{
私有对象;
私有方法;
public void OnClick(Object Object,String methodName)抛出NoSuchMethodException{
OnClick(object,object.getClass().getMethod(methodName));
}
公共void OnClick(对象、方法){
this.onClickObject=对象;
this.onClickMethod=方法;
}
//MyButton在每次单击按钮时调用此方法
//以通知外部事件处理程序
受保护的void onClick()引发IllegaAccessException、InvocationTargetException{
调用(onClickObject);
}
}
但也要注意,由于方法不是第一类公民,因此上述方法不是Java中实现事件侦听器的标准方法。相反,Java方法是使用回调方法定义接口,可能如下所示:

MyButton.OnClick(MyButtonClickEvent);

public void MyButtonClickEvent(EventArgs event) {

}
public interface ButtonListener {
    public void OnClick();
}
(这是假设您不必将任何参数传递给事件处理程序。通常情况下,这是无法假设的,因此除了
ButtonListener
,您还需要一个
ButtonEvent
,它封装了参数,并传递给接口中定义的方法。)

然后,如果您编写的类希望在单击某个按钮时接收事件,则该类必须实现
ButtonListener
。反过来,
MyButton
类必须提供注册侦听器的方法:

public MyButton {
    protected List<ButtonListener> buttonListeners;

    public void addButtonListener(ButtonListener listener) {
       ...
    }

    public void removeButtonListener(ButtonListener listener) {
       ...
    }

    protected void fireButtonEvent() {
       ...
    }
}
公共MyButton{
受保护的列表按钮侦听器;
公共void addButtonListener(ButtonListener侦听器){
...
}
public void removeButtonListener(ButtonListener侦听器){
...
}
受保护的无效fireButtonEvent(){
...
}
}
我相信您在Java标准类库中已经看到了很多这种模式,特别是在
Java.awt
javax.swing
中——例如,请参见
Java.awt.event.ActionListener
,这是awt用于按钮事件的