繁体   English   中英

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

[英]Java link event to event handler

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

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

Button MyButton = new Button();
MyButton.SetParent(MyContainer);
MyButton.SetText("Text inside my button!");
MyButton.SetTextColor(Color.BLACK);

现在,此代码将在我的一个游戏状态中被调用,而我想做的是这样的:

MyButton.OnClick(MyButtonClickEvent);

public void MyButtonClickEvent(EventArgs event) {

}

我的游戏状态的结构以及容器和元素是:

GameEngine-> GameState->容器->元素

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

Java没有将方法作为一等函数,即,该语言未提供对方法的引用,就像其他语言一样,该方法也可以传递给其他人。 对于问题中概述的结构,最好的选择是使用反射。

import java.lang.NoSuchMethodException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Set;

public class MyButton {
    private Object onClickObject;
    private Method onClickMethod;

    public void OnClick(Object object, String methodName) throws NoSuchMethodException {
        OnClick(object, object.getClass().getMethod(methodName));
    }

    public void OnClick(Object object, Method method) {
        this.onClickObject = object;
        this.onClickMethod = method;
    }

    // MyButton calls this method every time the button is clicked, in
    // order to inform the external event handler about it
    protected void onClick() throws IllegalAccessException, InvocationTargetException {
        onClickMethod.invoke(onClickObject);
    }
}

但也请注意, 由于方法不是一等公民,因此上述方法不是在Java中实现事件侦听器的规范方法。 取而代之的是,Java方法是使用回调方法定义一个接口,如下所示:

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() {
       ...
    }
}

我确定您已经在Java标准类库中看到了很多这种模式,尤其是在java.awtjavax.swing -例如,请参见java.awt.event.ActionListener ,这是AWT用于按钮事件的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM