Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слушатели в профессиональных SWING-приложениях 
:(
    Опции темы
mstalker26
Дата 23.8.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 3
Всего: 11



Собственно возник вопрос: как организовывают технику написания слушателей (listeners) в профессиональных (и что более важно в больших) swing-приложениях. Хотелось бы чтобы оставляли комментарии те, кто действительно работал с этим на практике. Я только в теории  smile , поэтому и стало интересно. Мне на ум пришли следующие варианты:
  • внутренние классы
  • анонимные классы
  • фабрика событий
  • диспечеризация

Анонимные классы с диспечеризацией мне как-то сразу не приглянулись. Хотя черт его знает, как на самом деле...
Было бы здорово, если расскажете о плюсах и минусах той или иной техники (вполне вероятно, что я чего-то по незнанию упустил).
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
Skipy
Дата 24.8.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 4
Всего: 16



Первые два варианта использую. Они простые в понимании и реализации. Третий - даже не представляю, что это. Четвертый - будут проблемы с расширяемостью и поддержкой приложения. Я посмотрю на Ваш метод диспетчеризации, когда у Вас будет хотя бы полсотни источников и слушателей.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
x8m6
Дата 24.8.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 11.12.2008

Репутация: нет
Всего: нет



Если на форме большое кол-во виджетов, то лучше выносить всех слушателей в отдельный класс и называть его FormController. В нем можно и логику сразу зашить. Так логика будет отделена от вида. В больших Swing приложениях здорово помогает.
PM MAIL   Вверх
COVD
Дата 24.8.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



А что понимается под "диспетчеризация"? События от контролов всегда доставляются зарегистрированным лисенерам (хендлерам) через event dispatching thread (EDT).

В приложении может быть возможность открывать одновременно несколько одинаковых окон. Например, пользователь наблюдает одну и ту же таблицу, но отсортированную по-разному. События могут быть как локальными для окна, так и уровня всего приложения. Пользователь удаляет строку в таблице -> следует запрос на сервер -> с сервера приходит подтверждение -> все открытые окна, отображающие таблицу, обновляются (возможно, у всех пользователей). В приложении может быть общая шина (очередь) для такого рода событий.       
PM MAIL   Вверх
mstalker26
Дата 24.8.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 3
Всего: 11



Спасибо тем, кто откликнулся.

2Skipy,
Про фабрику событий я представлял себе так. Существует один класс, например, ListenerFactory (можно даже его сделать Singleton) и в нем методы такие как
Код

public WindowListener getWindowL() {
    return new WindowListener() {
        public void windowClosing(WindowEvent we) {
            //смотрим что за окно и чего-нибудь с ним делаем
....

тогда присоединять слушатели было бы удобно
Код

addWindowListener(factory.getWindowL());

как минус представляется мне то, что из самой ListenerFactory фиг разберешь куда и к чему эти listeners относятся. Объяснил я похоже криво, но х8m6 похоже тоже самое через FormController делает.

С внутренними классами понятно, удобно. А с анонимными разве не возникает неразберихи?

Добавлено через 10 минут и 4 секунды
2COVD, 
про диспечеризацию я имел в виду следующее, вешается один и тот же слушатель, например на кнопки button1 и button2. А потом смотрим
Код

public void actionPerformed(ActionEvent ae) {
    if(ae.getSource() == button1)
        //чего-нибудь вытворяем
    else(ae.getSource() == button2)
        //ничего не вытворяем :)

но как skipy заметил, если слушателей и источников наберется н-ное количество, можно будет застрелиться, чтобы не мучаться.

P.S. На данный момент меня интересует техника написания слушателей для standalone приложений.

Вроде как выходит внутренние классы и отдельный класс со слушателями подходят больше всего?
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
COVD
Дата 24.8.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

вешается один и тот же слушатель

Я так делал, но у меня не было случая, когда в одном окне 50 кнопок.
PM MAIL   Вверх
jk1
Дата 24.8.2010, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Цитата

Вроде как выходит внутренние классы и отдельный класс со слушателями подходят больше всего? 


Подход с фабрикой хорош тогда, когда события и обработчики надо регистрировать (например для операций типа Undo) или организовывать сложные разветвленные цепочки обмена событиями и сообщениями.

Впрочем, последний случай больше располагает к применению JMS.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
mstalker26
Дата 25.8.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 3
Всего: 11



Похоже на то, что самые активные отписались в этой теме. Всем спасибо за ответы.
*ушел переваривать информацию*
--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
Старовъръ
Дата 25.8.2010, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: нет
Всего: 10



Цитата
Четвертый - будут проблемы с расширяемостью и поддержкой приложения. Я посмотрю на Ваш метод диспетчеризации, когда у Вас будет хотя бы полсотни источников и слушателей
У каждого контрола вроде есть actionName. В таком случае можно использовать: Map<String, Listener> и все будет пучком с точки зрения расширяемости. Тут только важно не запутаться со строковыми значениями.
Цитата
Подход с фабрикой хорош тогда, когда события и обработчики надо регистрировать (например для операций типа Undo)
undo и слушатели - это из разных эпопей строки. Чтоб организовать undo нужно реализовать Команду, которая будет деграться слушателем, т.о. слушатель будет один, но в нем может быть коллекция выполненных Команд (это как пример реализации). 
Цитата
Если на форме большое кол-во виджетов, то лучше выносить всех слушателей в отдельный класс и называть его FormController. В нем можно и логику сразу зашить. Так логика будет отделена от вида. В больших Swing приложениях здорово помогает. 
По-моему отличный вариант. Единственное - нужно подумать как сделать так, чтоб этот FormController не был зависим от Swing-классов, т.е. слушатели все равно будут, но они должны готовить запрос и делегировать выполнение этому FormController'у.

Добавлено через 6 минут и 7 секунд
Вот это сообщение так же советовал бы прочитать.

Это сообщение отредактировал(а) Старовъръ - 25.8.2010, 00:41
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.