2013-11-29 4 views
1

Я немного смущен тем, как использовать прослушиватели событий между моделью и контроллером. Я работаю над приложением, которое на стороне клиента я разделяю на две части: сам клиент, который выполняет всю связь с сервером и графическим интерфейсом. Клиент запускает события об обновлениях с сервера и передает события о действиях пользователей, которые интересует сервер (это приложение в основном многопользовательский графический редактор). Так что мои вопросы:MVC и прослушиватели событий в Java

  1. Я нашел, что это проще для GUI, чтобы сохранить ссылку на клиент и наоборот, вместо стрельбы событий и с помощью прослушивателя событий. Это вообще плохая практика?

  2. Теперь, если мы фактически используем события, я запутался в реализации. Итак, я создал несколько типов событий, которые я буду новым (drawEvent, connectionEvent и т. Д.). Затем я реализовал ClientListener и GUIListener с определенным поведением. Теперь, как мне запустить события? Из чтения я понял, что для того, чтобы графический интерфейс мог что-то запускать, нужно вызвать clientListener.eventHappened (event), правильно? Таким образом, он должен иметь этого слушателя, то есть клиент и графический интерфейс должны делиться слушателями (кажется, более сложными, чем просто ссылки)? И, наконец, как я могу добавить экземпляр GUIListener в gui? Опять же, из того, что я читал, мне нужно создать атрибут EventListenerList и просто добавить в него новый экземпляр GUI-приемника? Это оно? Я не понимаю, как это вызовет реальное прослушивание.

Извините, я просто изучаю все это и не имею полного понимания. Спасибо!

ответ

3

Не уверен, что вы дизайн лучше, но писать собственные слушатели/события довольно легко.

Например. вы сначала определить интерфейс для слушателя и класс для события

public class MyCustomEvent extends EventObject{ 
    //store all relevant info in your event 
} 

public interface MyListener{ 
    public void eventHappened(MyCustomEvent event); 
} 

Тогда, если у вас есть класс, к которому вы хотите прикрепить слушатель, вам просто необходимо иметь методы для добавления слушателей, и вызовите eventHappened метод на тех слушателей, когда это необходимо

public class MyClassWhichFiresEvents{ 
    private final List<MyListener> listeners = 
    new CopyOnWriteArrayList<MyListener>(); 

    public void addListener(MyListener listener){ 
    listeners.add(listener); 
    } 

    public void removeListener(MyListener listener){ 
    listeners.remove(listener); 
    } 
    //call this method whenever you need to fire an event 
    private void fireEvent(MyCustomEvent event){ 
    for (MyListener listener : listeners){ 
     listener.eventHappened(event); 
    } 
    } 
} 

Если вы задаетесь вопросом о CopyOnWriteArrayList для хранения слушателей. Когда вы повторяете слушателей, чтобы запустить событие, есть вероятность, что один из этих слушателей удалит себя. Таким образом, типичное решение состоит в том, чтобы сначала скопировать всех слушателей в другой список и перебрать этот список или использовать CopyOnWriteArrayList

+0

спасибо, я разработал события и слушатель, понял, как стрелять, но у вас проблемы с инициализацией самих слушателей, например внутри gui я вызываю listener = новый GUIlistener(). И как я могу добавить его в gui? (то есть эквивалент .addActionListener). Кроме того, я открыт для любых предложений по дизайну и был бы очень признателен! –

+1

@AndreiIvanov Вам нужно сосредоточиться на зависимости и поколении. Кто должен знать, что и кто что генерирует. Например, если ваш Gui заинтересован в том, чтобы знать, когда модель меняется, тогда Gui должен зарегистрировать своего слушателя в модели. Затем модели нужно решить, что он хочет сказать ... – MadProgrammer

+0

ой .. получил, спасибо! –

Смежные вопросы