![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Читаю Портянкина. Он советует использовать внутренние классы для обработки событий, но (я не нашел) ничего не говорит о implements XxxxListener
В примерах у sun для обработки событий реализуется implements XxxxListener. Подскажите, что и когда лучше использовать? |
|||
|
||||
| Foo |
|
||||||||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 164 Регистрация: 20.10.2006 Репутация: 2 Всего: 3 |
Внутренние классы implements XxxxListener или extends XxxxAdapter. В зависимости от ситуации. Адаптеры это классы которые имплементят стандартные интерфейсы методами с пустой реализацией. Их удобно использовать если мы хотим переопределить только некоторые методы из листенер интерфейса.
пример листенера:
если не хотим использовать все методы, для большей читаемости и красивости кода юзаем адаптер:
Также для обработки событий очень удобно использовать Action и InputMap для более гибкой настройки событий. пример:
здесь JComponent.WHEN_IN_FOCUSED_WINDOW - значит что действие актуально если компонент находится в окне с фокусом, есть ещё JComponent.WHEN_FOCUSED, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT (думаю значение их ясно из названия). Мы можем назничить практически любое сочетание клавиш на наш экшн. Вот еще примеры:
Постоянно выполняющиеся экшны лучше выносить в примерно такие классы:
тогда в класе в котором мы хотим использовать этот action можно сделать так:
Такую конструкцию например удобно использовать если в проекте много окон, наверняка на многих из них будет кнопка "Ок". ЗЫ: ногами не бить, описал тут частично свои неопытные соображения по поводу обработки событий. Это сообщение отредактировал(а) Foo - 12.2.2007, 20:20 --------------------
qip |
||||||||||||||||||
|
|||||||||||||||||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Foo, спасибо, но это не совсем то что я хотел услышать.
Есть пример http://java.sun.com/docs/books/tutorial/ui...s/ListDemo.java Я его изменил
т.е. создал внутренний класс class MyListener implements ListSelectionListener и уже в нем реализовывал метод public void valueChanged(ListSelectionEvent e). И вопрос у меня в том, а какой подход лучше использовать тот, который на sun или который использует в своей книге Портянкин? |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
С точки зрения производительности, или еще каких-нибудь объективных параметров, разницы нет. Что тебе кажется более удобным, то и возьми. Разница будет в том, что с помощью implements... ты сможешь обрабатывать события, приходящие от других компонентов, а через внутренние классы - только свои (ну и от дочерних компонентов). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
Т.е. насколько я понял подход, который использует sun более универсален и позволяет создавать более понятную структуру классов и проще повторно использовать уже написанный код? Или опять же зависит от архитектуры?
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
Я предпочитаю внутренние классы. Ибо нефиг посторонним дергать мои методы. Если я пишу implements..., то любой желающий может дернуть любой метод из этого интерфейса, а я на это не расчитывал.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| JVM |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 30.10.2006 Репутация: нет Всего: 5 |
А что важнее, чтобы другой не дергал "мои методы"(да и кому нужно их дергать?
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 10 Всего: 118 |
Однозначного решения скорее всего нет.
Но можно отметить следующий факт - при реакции на определенный тип событий (мышка, кнопка) - наиболее часто бывает надо просто переопределить один самый важный метод. И в этом случае удобнее пользоваться уже готовыми адаптерами. Я нередко пользуюсь анонимными классами - их-то точно никто дернуть не сможет Если же класс может реагировать на несколько видов событий, то скорее всего придется имплементировать интерфейсы полностью. Хотя это встречается не часто. |
|||
|
||||
| KOp4iK |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 26.11.2004 Где: Латвия Репутация: 1 Всего: 3 |
Тоже задавался этим вопросом...
С одной стороны когда главный клас implements ActionListener (например). Мы описываем тело метода
Если у нас один компонент, то получается то же как в случае использования отдельного (анонимного или нет) класса. Но если есть несколько компонентов, которые будет слушать этот листнер, то метод actionPerformed начинает разрастаться... при чём достаточно быстро... Кста а вот и пример... У вас есть формочка на ней куча кнопок (зарегистрироваться, отменить регистрацию, получить информацию, обновить таблицу.... итд).. Если следовать примеру Sun'a класс панельки на котором лежат эти кнопки implements ActionListener где в методе
С другой стороны всё в одном месте - компактно... да и Sun плохого не посоветует! Что до меня обычно в конце класса с кнопками я описываю XXXButtonActionListener внутренними классами потом при необходимости выношу их в отдельные если начинаю их юзать из разных мест |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 38 Всего: 538 |
У объекта есть контракт - какие методы он предоставляет, и как они себя ведут. Если по контракту объект должен реагировать на actionPerformed(), то пусть будет, иначе этого метода быть не должно. Плюс представим себе случай, у нас есть некий сложный компонент, состоящий из нескольких кнопок, полей ввода и т.д. Обрабатывать события от них одним листенером неудобно, гораздо удобной создать по отдельному листенеру на каждое событие. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| force |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.11.2005 Репутация: нет Всего: нет |
Зависит от ситуации. Если например у меня много кнопок, события нажатия на которые нужно обработать, то просто пишу
И потом уже в actionPerformed проверяю, событие от какой кнопки поступило. Т.е. в меня класс, который содержит объект, у которого возникает событие, реализует соответствующий интерфейс. У нас такой корпоративный стандарт. ВРоде удобно. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |