Лучшая практика с использованием повторно используемых действий над компонентами GUI - PullRequest
12 голосов
/ 28 сентября 2011

Я пробовал разные вещи о том, как сделать Actions возобновляемыми в моих приложениях 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...");
        }
    }

}

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

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

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

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

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

2 голосов
/ 28 сентября 2011

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

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

1 голос
/ 28 сентября 2011

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

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

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

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

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

...