События отмены и повтора действий в Java - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть приложение с JPanel и кнопками, по которым пользователи нажимают, чтобы рисовать фигуры на панели. Вы можете покрасить и изменить размеры форм, а также переместить их в панели. Как бы я реализовал отмену и повтор для такого приложения? У меня есть класс Actions, где все действия фактически реализованы. В этом классе у каждого действия есть свой собственный класс, который расширяет AbstractAction. Мой класс Actions - это в основном вложенный класс.

например, это один из классов в моем классе Actions:

private class RandomAction extends AbstractAction {
  private static final long serialVersionUID = 1L;
  public NewAction(String text, ImageIcon icon, String desc){
            super(text, icon);
            putValue(SHORT_DESCRIPTION, desc);
        }
        public void actionPerformed(ActionEvent e) {

        }
    }

Когда я создаю кнопку, все, что я делаю, это:

 randButton = new JButton(Actions.RandomAction);

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

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

Если вы используете Java и NetBeans (хотя, строго говоря, вам не нужно использовать IDE NetBeans), вы можете взглянуть на платформу NetBeans (можно загрузить отдельно). Я не много работал с отменой / повтором, но он действительно обеспечивает функциональность.

Лично я бы просто написал класс, который включает любое «действие», которое может выполнить пользователь, что, как я вижу, вы уже сделали. Теперь это просто вопрос реализации стека для отслеживания этих действий, и когда кто-то извлекается из стека отмены, вам нужно сделать «противоположность» действию. Поместите элемент в стек повторного выполнения, поэтому, когда пользователь нажимает кнопку «Повторить», вы можете просто вытолкнуть действие из стека повторного выполнения и позволить приложению обработать его, как обычно.

0 голосов
/ 18 ноября 2010

Я согласен с постом Нико и добавлю, что можно использовать один стек для отмены / восстановления.

Пару лет назад в университете я писал редактор диаграмм потоков данных, для которого требовалосьотменить / повторить функциональность.Я создал абстрактный класс Action, представляющий любое возможное действие пользователя (с помощью методов Undo и Do), и ActionStack, который оборачивает список всех выполненных действий и поддерживает указатель на последнее выполненное действие.Отменяющие действия перемещают указатель вниз по стеку, а повторяющий их перемещает его вверх.Таким образом, если пользователь выполняет 10 действий, стек будет содержать действия 1-10, а указатель указывает на действие # 10.Если пользователь затем выполнит 5 отмен, в стеке все равно останется 10 действий, но указатель вернется к действию № 5.Если затем пользователь выполнит новое действие, все действия над указателем (действия 6-10) будут удалены, новое действие будет добавлено в верхнюю часть стека, и указатель будет соответствующим образом скорректирован.

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

...