Java 为什么即使redo()工作正常,UndoManager.canRedo()仍返回false?

Java 为什么即使redo()工作正常,UndoManager.canRedo()仍返回false?,java,undo-redo,redo,Java,Undo Redo,Redo,我使用Java的undo包中的某些方法得到了相互矛盾的结果。在我的程序中,我对UndoManager实例调用canRedo(),该实例返回false。这会让我相信,我无法在此时重做存储在UndoManager中的任何操作。然而,当我尝试时,最后一个未完成的操作被正确地重做,并且没有抛出CannotRedoException。对我来说,这种行为似乎自相矛盾,我不确定是什么原因造成的 下面的代码是为这个问题创建的一个独立的单线程暂存文件 import javax.swing.undo.Abstrac

我使用Java的undo包中的某些方法得到了相互矛盾的结果。在我的程序中,我对UndoManager实例调用canRedo(),该实例返回false。这会让我相信,我无法在此时重做存储在UndoManager中的任何操作。然而,当我尝试时,最后一个未完成的操作被正确地重做,并且没有抛出CannotRedoException。对我来说,这种行为似乎自相矛盾,我不确定是什么原因造成的

下面的代码是为这个问题创建的一个独立的单线程暂存文件

import javax.swing.undo.AbstractUndoableEdit;
导入javax.swing.undo.CannotRedoException;
导入javax.swing.undo.CannotUndoException;
导入javax.swing.undo.UndoManager;
类UndoManagerRedoScratch{
公共静态void main(字符串[]args){
UndoManager操作列表=新建UndoManager();
addEdit(newsomeUndoableEdit());
/*查看SomeUndoableEdit是否可撤消*/
试一试{
System.out.println(“可以撤消操作:+actionList.canUndo());
actionList.undo();
}捕获(例外e){
System.out.println(“撤消失败”);
}
/*查看SomeUndoableEdit是否可重做*/
试一试{
System.out.println(“可以重做的操作:+actionList.canRedo());
actionList.redo();
}捕获(例外e){
System.out.println(“重做失败”);
}
}
}
类SomeUndoableEdit扩展了AbstractUndoableEdit{
公共SomeUndoableEdit(){
System.out.println(“已创建SomeUndoableEdit”);
}
@凌驾
public void undo()引发cannotundo异常{
System.out.println(“SomeUndoableEdit已撤消”);
}
@凌驾
public void redo()引发CannotRedoException{
System.out.println(“SomeUndoableEdit已被重做”);
}
}
输出:

SomeUndoableEdit已创建
操作可以撤消:true
某些可撤消的编辑已撤消。
操作可以重做:false
已重新进行了一些可撤消的编辑。
如您所见,redo()在没有引发CannotRedoException的情况下成功执行,但canUndo()返回false。同样,这对我来说似乎是矛盾的


有什么想法吗?

根据jre中的一些实现,比如
javax.swing.undo.StateEdit
您应该调用
super.undo()
super.redo()
,作为重写方法中的第一个调用

关于你的情况:

class SomeUndoableEdit extends AbstractUndoableEdit {

    public SomeUndoableEdit() {
        System.out.println("SomeUndoableEdit has been created");
    }

    @Override
    public void undo() throws CannotUndoException {
        super.undo();
        System.out.println("SomeUndoableEdit has been undone.");
    }

    @Override
    public void redo() throws CannotRedoException {
        super.redo();
        System.out.println("SomeUndoableEdit has been redone.");
    }
}

非常感谢,这似乎解决了它!关于在哪里可以找到这样的信息,有什么建议吗?我在Oracle的AbstractUndoableEdit或StateEdit文档中没有看到它。基本上在
AbstractUndoableEdit
的类型层次结构中搜索了一些示例。