[英]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.awt
和javax.swing
-例如,请参见java.awt.event.ActionListener
,这是AWT用于按钮事件的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.