Подтвердить что ты не робот

Лучшая практика с использованием многоразовых действий с компонентами графического интерфейса пользователя

Я пробовал разные вещи о том, как сделать действия Resuable в моих приложениях Swing. Я не друг на тяжелых, 1000 + линейных классах (с большим количеством внутренних/анонных классов) и пытаюсь разбить мой код на несколько классов. Таким образом, они могут быть легко и легко заменяемыми.

Для повторного использования одних и тех же действий в приложении я сделал для каждого действия свой собственный класс, чтобы использовать его в JMenuBar и JToolBar. Пожалуйста, ознакомьтесь с минимальным примером ниже.

Является ли это хорошей выбранной практикой (например, с использованием статических внутренних классов)?

public class SomeGUI extends JFrame {

    public static void main(String[] args)
    {
        new SomeGUI();
    }

    public SomeGUI()
    {
        setJMenuBar(new MyMenuBar());
        add(new MyToolBar());

        setSize(400, 400);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

}

class MyMenuBar extends JMenuBar {

    JMenu menu = new JMenu("File");

    public MyMenuBar()
    {
        add(menu);
        menu.add(new JMenuItem(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N)));
    }

}

class MyToolBar extends JToolBar {

    public MyToolBar()
    {
        add(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N));
    }

}

class Actions {

    static class NewAction extends AbstractAction {
        public NewAction(String name, ImageIcon icon, String desc, Integer mnemonic)
        {
            super(name, icon);
            putValue(SHORT_DESCRIPTION, desc);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent paramActionEvent)
        {
            System.out.println("do the new action...");
        }
    }

}

Ждем ваших советов. Спасибо заранее.

4b9b3361

Ответ 1

Является ли это хорошей выбранной практикой (например, с использованием статических внутренних классов)?

Таким образом реализуется большая часть базового кода Swing.

Например, посмотрите исходный код DefaultEditorKit, где определены все действия.

Ответ 2

Одно предложение - не использовать совокупный класс, который содержит все действия. Просто используйте отдельный файл для каждого класса и сделайте его общедоступным.

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

Ответ 3

То, что я часто делаю (и это еще проще при использовании GutsAction из guts-gui) заключается в том, что я группирую связанные действия в одном класс.

Я сохраняю каждое действие как поле final public (но если вы ненавидите поля public, вы все равно можете сделать их private и dfine метод getter на каждом).

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

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

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