2013-06-21 2 views
0

Я работаю над графической библиотекой для своей игры, и я пытаюсь найти хороший способ связать события из элементов GUI (например, событие click от кнопки) до обработчик события.Java link event to event handler

Скажем, у меня есть кнопка под названием MyButton. Я хотел бы использовать следующий код, чтобы установить его (неполным, просто для демонстрации):

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

Теперь этот код будет называться в одном из моих gamestates, и то, что я хотел бы сделать что-то вроде этого:

MyButton.OnClick(MyButtonClickEvent); 

public void MyButtonClickEvent(EventArgs event) { 

} 

структура моих gamestates и контейнеров и элементов:

GameEngine-> GameState-> container-> элементы

Что было бы самым близким решением для этого? Заранее спасибо.

ответ

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

(Это предполагает, что вы не должны передавать параметры в обработчик события Обычно, это не может можно предположить, что в дополнение к 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 для событий кнопок.