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




Что ж, поскольку очень необычно, что два компонента делают одно и то же, очень вероятно, что вам понадобится собственный ActionListener для каждого компонента.
Если по какой-либо причине два компонента делают одно и то же, то самый простой способ, о котором я думаю, - это просто передать код методу на аутсорсинг, а затем вызвать метод из ActionListener.
Я думаю, что нет возможности обрабатывать несколько кнопок в одном слушателе действия. но каждый раз, когда вы нажимаете кнопку, все текстовые поля могут обрабатываться в одном и том же actionListener. Кроме того, кажется нетривиальным обрабатывать несколько кнопок в одном и том же actionListener.
хорошо, но похоже, что было бы неэффективно и действительно однообразно создавать новый прослушиватель действий для каждой отдельной кнопки, которая у вас есть на протяжении всей программы. или это обычная практика?
ActionEvent (чтобы быть более конкретным: EventObject) имеет свойство source, которое можно использовать для различения кнопок в одном и том же слушателе, просто FYI.
Или вы создаете один раз для каждого слушателя, что может быть очень лаконичным с лямбда-выражениями.
ИЛИ вы сохраняете ссылки на кнопки и сравниваете их с 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);
о, хорошо, это на самом деле близко к тому, что я думал, может сработать. Благодарность
Мне очень не нравится паттерн if (evt.getSource() == x)... else if (evt.getSource() == y).
Единственная проблема заключается в том, что если выполняемое действие (более одной строки) внутри оператора if находится внутри ActionListener, лучше всего создать отдельные методы для каждого и просто вызвать внутри if / else или использовать Map <Button, Метод> подход (который мне нравится)
Если у кнопки другой функционал, создайте отдельный слушатель. Не рекомендуется использовать вложенные операторы if / else. Если у кнопки есть общие функции, вы можете поделиться слушателем. См .: stackoverflow.com/questions/33739623/… для примера этого подхода.
Создайте специализированный класс, который выполняет общие операции, которые можно настроить, передав параметры конструктору.
Используйте Анонимные классы
Используйте API действий и создавайте небольшие повторно используемые операции.
Это похоже на первый пункт, но обеспечивает гораздо более настраиваемую единицу работы, которую можно легко применить к пунктам меню, кнопкам и привязкам клавиш.
ActionEvent ...ActionEvent содержит количество свойств использования, actionCommand, вероятно, был одним из наиболее распространенных (по крайней мере, до появления анонимных классов).
Это позволяет отделить источник события от действия, которое должно произойти, что позволяет повторно использовать ActionListener (или тот же экземпляр) на нескольких объектах.
Сказав это, API Action более или менее сделал его избыточным.
Намерение состояло бы в том, чтобы сосредоточиться на основных операциях и разработать повторно используемые и / или настраиваемые классы, которые можно легко выделить или которые могут помочь уменьшить общее повторение и дублирование общего кода.
Нет, вы можете создавать слушателей для добавления к нескольким компонентам. Однако это не очень распространено, и создание индивидуальных - не большая трата времени.