Команды действий против классов действий? - PullRequest
6 голосов
/ 30 июля 2009

Привет всем Свинг-гуру !!

Я занимаюсь программированием на Swing в течение нескольких лет, но мне всегда было непонятно, как это сделать.

Как вы знаете, Swing / AWT дает вам несколько способов выполнить определенное действие при нажатии кнопки. Я видел, как это делалось несколькими разными способами в приложениях, над которыми я работал. Проект, над которым я сейчас работаю, имеет тенденцию следовать этому подходу:

someButton.setActionCommand("mycommand");
someButton.addActionListener(listener);

- чик -

public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();
    if (command.equals("mycommand"))
       doThis();
    else if (command.equals("someothercommand"))
       doThat();
etc.

Это кажется мне неуклюжим - есть ли польза для этого стиля программирования или лучше использовать Swing Action s?

Или есть разные ситуации, когда разные подходы лучше / хуже?

Ответы [ 4 ]

4 голосов
/ 30 июля 2009

IMO, лучше использовать отдельные слушатели для действий.

Таким образом, вы оставляете делегирование того, какое действие должно произойти, до Swing. Вам не нужно сравнивать строки, чтобы решить, что делать.

Наличие одного огромного ActionListener для более чем одного действия - все равно что сломать шаблон для меня.

3 голосов
/ 30 июля 2009

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

Кроме того, если вы используете Action, вы можете а) применить его к нескольким компонентам (например, к кнопке и пункту меню); ) Также используйте его для определения различных настроек компонентов, к которым он прикреплен (а именно, текстовой метки, текста всплывающей подсказки, клавиши ускорения, значка и т. Д.). Последний выполняется с помощью метода putValue, и повторный вызов этого метода изменит настройки для всех компонентов, к которым он подключен.

В частности, я бы посоветовал подкласс AbstractAction для ваших нужд.

1 голос
/ 30 июля 2009

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

Использование классов Action, как правило, позволяет улучшить рефакторинг. В Swing, один из лучших способов начать - убедиться, что в вашем коде нет строк. Почти каждое «Новое» будет в каком-то цикле чтения из набора данных (часто набор данных так же прост, как массив). Как только вы начнете читать из такого набора данных, действия могут вам сильно помочь.

Вы используете данные для создания своего действия, данные для создания своего элемента управления и данные, чтобы связать их - таким образом, вы можете оказаться очень близко к (или в) 0 строкам кода для нового элемента управления.

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

0 голосов
/ 30 июля 2009

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

Установите для них одну и ту же команду действия, и они будут использовать один и тот же код в слушателе

JButton.addActionListener(this);
JButton2.addActionListener(this);
JButton.setActionCommand("exit");
JButton2.setActionCommand("exit");

public void ActionPerformed(ActionEvent e){
    if(e.getActionCommand=="exit")
        System.exit(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...