[英]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.