【问题标题】:Undo and Redo Action events in JavaJava 中的撤消和重做动作事件
【发布时间】:2011-05-11 19:55:16
【问题描述】:

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

【问题讨论】:

    标签: java undo redo


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我其实是想这样实现的。
    【解决方案2】:

    我同意 Nico 的帖子,我会补充一点,可以使用一个堆栈进行撤消/重做。

    几年前在大学里,我正在编写一个数据流图编辑器,它需要完整的撤消/重做功能。我创建了一个抽象的 Action 类,代表任何可能的用户操作(使用 Undo 和 Do 方法),以及一个 ActionStack,它包装了所有已执行操作的列表并维护指向最后执行的操作的指针。撤消操作将指针移到堆栈的下方,而重做则将其向上移动。因此,如果用户执行 10 个动作,堆栈将包含动作 1-10,并且指针指向动作 #10。如果用户随后执行 5 次撤消操作,堆栈上仍有 10 个操作,但指针移回操作 #5。如果用户随后执行了一个新动作,则指针上方的所有动作(动作 6-10)都将被删除,新动作将被添加到堆栈顶部,并相应地调整指针。

    您描述的用户操作听起来并不太复杂,但对于更复杂的操作,您可能希望允许它们由子操作组成。

    【讨论】:

    • 我正在为我当前项目的撤消/重做功能做同样的事情。
    • 我可能会尝试这个,因为它没有两个堆栈,可以让我的应用程序更节省空间。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2013-03-09
    • 2021-01-30
    • 2021-03-27
    相关资源
    最近更新 更多