Также стоит отметить, что можно использовать *
и **
при вызывании функций также. Это - ярлык, который позволяет Вам передавать несколько аргументов функции непосредственно с помощью или списка/кортежа или словаря. Например, если у Вас есть следующая функция:
def foo(x,y,z):
print("x=" + str(x))
print("y=" + str(y))
print("z=" + str(z))
можно сделать вещи как:
>>> mylist = [1,2,3]
>>> foo(*mylist)
x=1
y=2
z=3
>>> mydict = {'x':1,'y':2,'z':3}
>>> foo(**mydict)
x=1
y=2
z=3
>>> mytuple = (1, 2, 3)
>>> foo(*mytuple)
x=1
y=2
z=3
Примечание: ключи mydict
нужно назвать точно как параметры функции foo
. Иначе это бросит TypeError
:
>>> mydict = {'x':1,'y':2,'z':3,'badnews':9}
>>> foo(**mydict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got an unexpected keyword argument 'badnews'
IMO, лучше использовать отдельные слушатели для действий.
Таким образом, вы оставляете делегирование того, какое действие должно происходить, на право Swing. Вам не нужно сравнивать строки, чтобы решить, что делать.
Наличие одного огромного ActionListener
для более чем одного действия мне кажется нарушением шаблона.
С точки зрения дизайна, я думаю, что лучше иметь один класс для обработки одного конкретного действия для компонента, а не один класс, который "позволяет обрабатывать все для всех компонентов здесь" "тип дизайна.
Кроме того, если вы используете Action
, вы можете а) применить его к более чем одному компоненту (например, кнопке и пункту меню) б) вызвать setEnable
для включения / отключения его для всех компонентов, к которым он прикреплен, и c) Также используйте его для определения различных настроек для компонентов, к которым он прикреплен (а именно, текстовой метки, текста всплывающей подсказки, клавиши быстрого доступа, значка и т. Последний выполняется с помощью метода putValue
, и повторный вызов этого метода изменит настройки для всех компонентов, к которым он подключен.
В частности,
Я знаю, что это демонстрационный код, но, поскольку вы работаете над этим материалом, я подумал, что упомянул бы, что свинг имеет тенденцию к повторению, если вы не будете осторожны.
Использование классов Action позволяет лучше выполнить рефакторинг. В свинге один из лучших способов начать - убедиться, что в вашем коде НЕТ строк. Почти каждое «новое» будет в каком-то цикле чтения из набора данных (часто набор данных такой же простой, как массив) - как только вы начнете читать из такого набора данных, действия могут вам очень помочь.
Вы используете данные для создания своего действия, данные для создания вашего элемента управления и данные для их связи - таким образом вы можете оказаться очень близко (или на) 0 строк кода для нового элемента управления.
Один раз вы начинаете программировать таким образом и видите закономерности, это '
Это полезно, если у вас есть несколько кнопок или компонентов, которые выполняют одно и то же действие (т. Е. Несколько кнопок выхода на одной странице будут использовать один и тот же код)
Установите для них одно и то же действие команда, и все они будут использовать один и тот же код в слушателе
JButton.addActionListener(this);
JButton2.addActionListener(this);
JButton.setActionCommand("exit");
JButton2.setActionCommand("exit");
public void ActionPerformed(ActionEvent e){
if(e.getActionCommand=="exit")
System.exit(0);
}