0

ゲームの GUI ライブラリに取り組んでおり、GUI 要素からのイベント (ボタンからのクリック イベントなど) をイベント ハンドラーにリンクする良い方法を見つけようとしています。

MyButton というボタンがあるとします。次のコードを使用してセットアップします (不完全で、デモンストレーションのためだけです)。

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

このコードは私のゲームステートの 1 つで呼び出されます。私がやりたいことは次のようなものです。

MyButton.OnClick(MyButtonClickEvent);

public void MyButtonClickEvent(EventArgs event) {

}

私のゲームステートとコンテナーと要素の構造は次のとおりです。

GameEngine -> GameState -> Container -> Elements

これに対する最も近い解決策は何ですか?前もって感謝します。

4

1 に答える 1

0

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();
}

(これは、イベント ハンドラーにパラメーターを渡す必要がないことを前提としています。通常、これは想定できないため、 に加えて、パラメーターをカプセル化し、メソッドに渡される もありますButtonListenerButtonEvent) インターフェイスで定義されています。)

次に、特定のボタンがクリックされるたびにイベントを受け取ることに関心があるクラスを作成する場合、そのクラスは を実装する必要がありますButtonListener。次に、MyButtonクラスはリスナーを登録するメソッドを提供する必要があります。

public MyButton {
    protected List<ButtonListener> buttonListeners;

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

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

    protected void fireButtonEvent() {
       ...
    }
}

java.awtJava 標準クラス ライブラリ、特にandでそのパターンをかなり見たことがあると思います。javax.swingたとえばjava.awt.event.ActionListener、AWT がボタン イベントに使用する と を参照してください。

于 2013-06-21T04:20:38.573 に答える