Организация действий в приложении Swing?

В моем текущем приложении есть JFrame с примерно 15 действиями, хранящимися в виде полей внутри JFrame. Каждое из действий - это анонимный класс, и некоторые из них довольно длинные.

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

Если нет, то как обычно преодолевается эта сложность?

Спасибо

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

Ответы 3

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

В конце концов, это также становится неуправляемым, и тогда вы должны начать думать об использовании инфраструктуры приложений, такой как Eclipse RCP, NetBeans framework, JIDE и т. д. Это особенно верно, если вы хотите поддерживать определяемые пользователем раскладки клавиатуры и тому подобное.

Ответ принят как подходящий

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

Скорее создайте отдельный пакет и создайте классы для каждого.

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

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

Я думаю, что, возможно, в качестве альтернативы или в дополнение к ActionManager, действия являются хорошими кандидатами для внедрения в представление, используя, например, Spring.

ktulinho 19.01.2012 21:20

Что я делаю, так это создаю пакет (фактически дерево пакетов) для классов действий, а затем создаю экземпляр каждого класса в соответствии с контекстом. Почти все мои классы действий абстрактны с абстрактными методами для получения контекста (как Spring).

public abstract class CalcAndShowAction extends AbstractAction {
    //initialization code - setup icons, label, key shortcuts but not context.

    public void actionPerformed(ActionEvent e) {
        //abstract method since it needs ui context
        String data = getDataToCalc();

        //the actual action - implemented in this class, 
        //  along with any user interaction inherent to this action
        String result = calc(data);  

        //abstract method since it needs ui context
        putResultInUI(result);
    }
    //abstract methods, static helpers, etc...
}

//actual usage
//...
button.setAction(new CalcAndShowAction() {
    String getDataToCalc() {
        return textField.getText();
    }

    void putResultInUI(String result) {
        textField.setText(result);
    }
});
//...

(извините за ошибки, я написал это вручную в этом текстовом поле, а не в IDE).

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