簡體   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