Java 中的撤消和重做操作事件

sig*_*eik 3 java undo redo

我有一个带有 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) {

        }
    }
Run Code Online (Sandbox Code Playgroud)

当我然后创建一个按钮时,我所做的就是:

 randButton = new JButton(Actions.RandomAction);
Run Code Online (Sandbox Code Playgroud)

Nic*_*men 5

通常撤消/重做功能是通过实现堆栈来完成的。您可以实现自己的操作堆栈来跟踪之前的 X 操作,然后您可以在每次用户撤消操作时弹出这些操作堆栈。您可能还需要为重做功能保留类似类型的结构。所以当一个动作从撤消堆栈中弹出时,它首先需要进入重做堆栈。

如果你使用Java和NetBeans(虽然严格来说你不需要使用NetBeans IDE),你可以看看NetBeans Platform(可以单独下载)。我没有太多地使用撤消/重做,但它确实提供了功能。

就我个人而言,我只会编写一个包含用户可以执行的任何“操作”的类,我看到您已经完成了。现在只需实现一个堆栈来跟踪这些操作,当一个操作从撤消堆栈中弹出时,您需要执行该操作的“相反”操作。将项目放在重做堆栈上,因此当用户单击重做时,您可以简单地将操作从重做堆栈中弹出并让您的应用程序像往常一样处理它。