отменить, повторить, удалить функцию в Java - PullRequest
0 голосов
/ 12 января 2010

Мне нужно написать эти 3 функции, но я застрял в повтор и удалить. Повторить показывает ошибку, когда нечего повторять, и я не знаю, как написать функцию удаления. Спасибо

отмена

public class Undo extends AbstractAction {

private MyCanvas myCanvas;

public Undo(MyCanvas myCanvas) {
    this.myCanvas = myCanvas;
    this.putValue(NAME, "Undo");
    this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Z"));
    this.putValue(SMALL_ICON, new ImageIcon(Main.class.getResource("/icons/Undo24.gif")));
}

public void actionPerformed(ActionEvent e) {
    if (!myCanvas.commands.isEmpty()) {

        Command cmd = myCanvas.commands.pop();
        cmd.undo();
        myCanvas.undoneCommands.add(cmd);
        myCanvas.repaint();
    }
            else
                System.out.println();
}
}

повтор

public class Redo extends AbstractAction {

private MyCanvas myCanvas;

public Redo(MyCanvas myCanvas) {
    this.myCanvas = myCanvas;
    this.putValue(NAME, "Redo");
    this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Y"));
    this.putValue(SMALL_ICON, new ImageIcon(Main.class.getResource("/icons/Redo16.gif")));
}

public void actionPerformed(ActionEvent e) {
    //if (!myCanvas.commands.isEmpty()) {
        Command cmd = myCanvas.undoneCommands.pop();
        cmd.execute();
        myCanvas.commands.add(cmd);
        myCanvas.repaint();
    //}
        //   else
               System.out.println();
}
}

Ответы [ 3 ]

1 голос
/ 12 января 2010

Это сложная проблема, которую можно решить в общем случае - если бы это было легко, это было бы в библиотеке.

Одним из способов является то, чтобы каждое «Действие» было классом. Например, класс «Добавить текст» может добавить количество символов на экран в заданной позиции. Этот объект создается при вводе и помещается в стек после завершения (возможно, вам нужен один объект для каждого символа.

Хитрость в том, что каждое «Действие» также имеет метод отмены, который может отменить сам. Таким образом, повторяющиеся отмены становятся просто цепочкой actionStack.pop (). Undo ();

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

Похоже, что вы пытаетесь что-то сделать в этом направлении, но не создаваете отдельный объект для каждого типа действия, которое может повлиять на документ (AddCharacter, Delete, EraseDocument, ...). Это выполнимо - это так, как если бы вы делали это не на языке OO, но это не просто и не чисто. Например, вам нужно будет хранить произвольные метаданные, такие как удаленный текст, позицию, из которой вы удалили и т. д. в какую-то часть вашего стека.

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

1 голос
/ 12 января 2010

Полагаю, вы захотите взглянуть на шаблон команды .

В книге Head First Design Patterns также есть хорошая запись.

0 голосов
/ 08 сентября 2012

Я написал простую среду Java Undo / Redo. Там нет внешних зависимостей, и это полностью бесплатно. Попробуй

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