Нужно ли мне создавать отдельный ActionListener для каждого создаваемого мной компонента?

В настоящее время я изучаю java.swing и обработку событий, и я просто начал с одной кнопки, которая меняет текст метки, и все. Я делаю это следующим образом: создаю ActionListener и добавляю его в компонент кнопки, а затем использую метод ActionPerformed для изменения текста метки. Теперь меня интересуют программы более крупного масштаба. Придется ли вам создать новый ActionListener для компонента каждый, с которым пользователь может взаимодействовать? Должен быть лучший способ сделать это, что это?

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

daniu 31.07.2018 22:16

хорошо, отлично, так что если бы я сделал это, это не считалось бы плохой практикой?

hyphxnated 31.07.2018 22:19

Создание нового слушателя для каждого компонента - это прекрасно, и, вероятно, даже предпочтительнее. См., Например, разделение проблем и принцип единой ответственности.

Radiodef 31.07.2018 22:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
346
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Что ж, поскольку очень необычно, что два компонента делают одно и то же, очень вероятно, что вам понадобится собственный ActionListener для каждого компонента.

Если по какой-либо причине два компонента делают одно и то же, то самый простой способ, о котором я думаю, - это просто передать код методу на аутсорсинг, а затем вызвать метод из ActionListener.

Я думаю, что нет возможности обрабатывать несколько кнопок в одном слушателе действия. но каждый раз, когда вы нажимаете кнопку, все текстовые поля могут обрабатываться в одном и том же actionListener. Кроме того, кажется нетривиальным обрабатывать несколько кнопок в одном и том же actionListener.

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

hyphxnated 31.07.2018 22:20

ActionEvent (чтобы быть более конкретным: EventObject) имеет свойство source, которое можно использовать для различения кнопок в одном и том же слушателе, просто FYI.

sn42 31.07.2018 22:23
Ответ принят как подходящий

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

ИЛИ вы сохраняете ссылки на кнопки и сравниваете их с action.getSource с оператором if / else, например:

Button x, y; //initialized somewhere
ActionListener l = new ActionListener() {
    public void onActionPerformed(ActionEvent evt) {
        if (evt.getSource() == x) {
            //Do action for x
        } else if (evt.getSource() == y) {
            //Do action for y
        }
}
x.addActionListener(l);
y.addActionListener(l);

о, хорошо, это на самом деле близко к тому, что я думал, может сработать. Благодарность

hyphxnated 31.07.2018 22:25

Мне очень не нравится паттерн if (evt.getSource() == x)... else if (evt.getSource() == y).

daniu 31.07.2018 22:35

Единственная проблема заключается в том, что если выполняемое действие (более одной строки) внутри оператора if находится внутри ActionListener, лучше всего создать отдельные методы для каждого и просто вызвать внутри if / else или использовать Map <Button, Метод> подход (который мне нравится)

Marcos Vasconcelos 31.07.2018 22:39

Если у кнопки другой функционал, создайте отдельный слушатель. Не рекомендуется использовать вложенные операторы if / else. Если у кнопки есть общие функции, вы можете поделиться слушателем. См .: stackoverflow.com/questions/33739623/… для примера этого подхода.

camickr 31.07.2018 22:44

Вы могли...

Создайте специализированный класс, который выполняет общие операции, которые можно настроить, передав параметры конструктору.

Вы могли...

Используйте Анонимные классы

Вы могли...

Используйте API действий и создавайте небольшие повторно используемые операции.

Это похоже на первый пункт, но обеспечивает гораздо более настраиваемую единицу работы, которую можно легко применить к пунктам меню, кнопкам и привязкам клавиш.

ActionEvent ...

ActionEvent содержит количество свойств использования, actionCommand, вероятно, был одним из наиболее распространенных (по крайней мере, до появления анонимных классов).

Это позволяет отделить источник события от действия, которое должно произойти, что позволяет повторно использовать ActionListener (или тот же экземпляр) на нескольких объектах.

Сказав это, API Action более или менее сделал его избыточным.

Общий...

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

Другие вопросы по теме