Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > свои листенеры и свои эвенты


Автор: sol78 3.9.2007, 23:07

Нужна помощь!

Скажите, возможно самому написать т.сказать архитектуру Listener-Event, которую используют например для написания GUI?
Более конкретоно о задаче: 
есть куча средов, и нужно что бы они "слушали" некоторое событие, например StopEvent для данного среда и затем происходило действие , например StopAction(). И в свою очередь некая таблица должна слушать некоторое событие, например ErrorEvent посланное от определенного среда (сообщение о какой либо ошибке) и обрабатывает его....
В целом картина мне понятна, не я не знаю какие у джавы есть для этого инструменты?

Ваши предложения? 

Автор: shimopus 3.9.2007, 23:28
Ну стандартная реализация шаблона "Observer" в jdk находится в классах http://java.sun.com/j2se/1.4.2/docs/api/java/util/Observer.html и http://java.sun.com/j2se/1.4.2/docs/api/java/util/Observable.html Для лучшего понимания как это все использовать советую прочитать так же про паттерн проектирования "MVC" (Model-Viewer-Controller).

Автор: batigoal 5.9.2007, 08:35
Цитата(sol78 @  4.9.2007,  00:07 Найти цитируемый пост)
В целом картина мне понятна, не я не знаю какие у джавы есть для этого инструменты?

Как ни странно, лисенеры и евенты smile

Посмотри вот эту статейку, я пока не могу найти полноценный мануал: http://www.javaworld.com/javaqa/2000-08/01-qa-0804-events.html

Добавлено через 4 минуты и 28 секунд
Вот еще одна: http://www.exampledepot.com/egs/java.util/CustEvent.html

А вообще, этот вопрос у нас рассматривался в контексте JavaИeans.

Автор: Maksym 5.9.2007, 13:21
http://en.wikipedia.org/wiki/Observer_pattern (http://ru.wikipedia.org/wiki/Observer_%28%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%29)
http://www.javaworld.com/javaworld/javaqa/2001-05/04-qa-0525-observer.html?page=1

Автор: lando1 10.9.2007, 14:27
вообще, можно скачать исходники swing и посмотреть как там сделано. 

нужен класс - событие, который наследуется от java.util.EventObject:
Код

import java.util.EventObject;
public class WSEvent extends EventObject {

    public WSEvent(Object source) {
        super(source);
    }    
}


 и интерфейс - слушатель:

Код

import java.util.EventListener;

public interface WSChangeListener  extends EventListener {

    void projectAdded(WSEvent e);
}


далее в класс, который хотим слушать добавляем примерно след. код:

Код

    protected EventListenerList listenerList = new EventListenerList();
    
    public void addWorkspaceModelListener(WSChangeListener l) {
     listenerList.add(WSChangeListener.class, l);
        }

    public void removeWorkspaceModelListener(WSChangeListener l) {
     listenerList.remove(WSChangeListener.class, l);
        }
        
    
    
    protected void fireProjectAdded(Object source)
    {
    Object[] listeners = listenerList.getListenerList();
    WSEvent e = null;
    for (int i = listeners.length - 2; i >= 0; i -= 2) {        
        if (listeners[i] == WSChangeListener.class) {
        if (e == null) {
            e = new WSEvent(source);
        }
        ((WSChangeListener)listeners[i+1]).projectAdded(e);
        }           
     }
    }


и потом в методах этого класса можно вызывать fire*** - и соответственно будут рассылаться уведомления

Автор: w1nd 10.9.2007, 23:06
Именование классов и методов также имеет немаловажное значение. Я не уверен, что такой метод
Код
public void addWorkspaceModelListener(WSChangeListener l)

будет корректно отражён в автоматическом beaninfo.

Автор: COVD 11.9.2007, 05:22
Цитата

какие у джавы есть для этого инструменты

Лисенер - это обьект, у которого есть void метод. Событие - это параметр (обычно тоже обьект), который в этот метод передается. Мы вызвали метод = лисенер услышал событие. В GUI только эти события в очередь ставят и отдельный поток их обрабатывает. А лисенеры как правило регистрируют в runtime. Очередь событий и динамическая регистрация лисенеров наверное и есть суть такого подхода. А если это развить, то получится JMS - сервис сообщений.

Автор: sol78 12.9.2007, 13:27
обьясни плиз что именно делает 
 protected void fireProjectAdded(Object source)

Автор: batigoal 17.9.2007, 07:57
Цитата(sol78 @  12.9.2007,  14:27 Найти цитируемый пост)
protected void fireProjectAdded(Object source)

По всей видимости, оповещает все лисенеры о том, что произошло событие ProjectAdded. Или, другими словами, запускает метод projectAdded  у каждого зарегистрированного лисенера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)