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