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

我有一个带有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);
    
已邀请:
通常,通过实现堆栈来完成撤消/重做功能。您可以实现自己的操作堆栈来跟踪以前的X操作,然后每次用户撤消操作时都可以弹出这些操作。您可能还需要为重做功能保留类似类型的结构。因此,当撤消堆栈弹出一个动作时,它首先需要进入重做堆栈。 如果您使用的是Java和NetBeans(尽管严格来说您不需要使用NetBeans IDE),您可以查看NetBeans平台(可以单独下载)。我没有使用undo / redo,但确实提供了功能。 就个人而言,我只会编写一个包含用户可以执行的任何“操作”的类,我看到你已经完成了。现在只需要实现堆栈来跟踪这些操作,并且当从堆栈弹出一个堆栈时,您需要执行操作的“相反”。将项目放在重做堆栈上,因此当用户单击重做时,您可以简单地从重做堆栈弹出操作,让应用程序像往常一样处理它。     
我同意Nico的帖子,我将补充说,可以使用一个堆栈进行撤消/重做。 回到大学几年后,我正在编写一个数据流图编辑器,需要完全撤消/重做功能。我创建了一个抽象的Action类,表示任何可能的用户操作(使用Undo和Do方法),以及一个ActionStack,它包装了所有已执行操作的List,并维护指向上次执行的Action的指针。撤消操作会将指针向下移动到堆栈中,然后重做它们会将其向上移动。因此,如果用户执行10个动作,则堆栈将包含动作1-10并且指针指向动作#10。如果用户然后执行5个撤消操作,则堆栈上仍将有10个操作,但指针将移回操作#5。如果用户然后执行新操作,则将删除指针上方的所有动作(动作6-10),新动作将被添加到堆栈的顶部,并且指针相应地调整。 您描述的用户操作听起来并不复杂,但对于更复杂的操作,您可能希望允许它们由子操作组成。     

要回复问题请先登录注册