编辑:请看帖子的末尾...
首先,请原谅我的英语不好...
我正在尝试用 Java 制作一个文本编辑器,使用 JTabbedPane 来编辑多个文件。在这种情况下,我在 Internet 上没有找到使用 UndoManager 的好帮助。
所以我尝试了一些东西,但它似乎不起作用。
事实上,我试图通过在更改选项卡时收听来保存所有 UndoableEdit。当我更改选项卡时,我会为之前打开的选项卡保存 UndoableEdits,然后清理 UndoManager 的编辑,最后,我恢复新活动选项卡的 UndoableEdits。
我遇到的问题是,当我调用更新撤消/重做按钮状态的函数时,canUndo()/canRedo() 方法总是返回 false,但列表中有编辑...而且我不知道为什么发生这种情况,我不明白我忘了做什么......
显然,尽管 UndoableEdits 存在于“编辑”向量中,但 UndoManager 并不关心这一点。当我试图强制启用按钮时,抛出异常......(javax.swing.undo.CannotUndoException / javax.swing.undo.CannotRedoException)
请问你能帮帮我吗 ?
如果您需要,请随时向我询问更多信息。
谢谢你。
我对 UndoManager 类的扩展:
public class UndoManagerPerso extends UndoManager
{
private static final long serialVersionUID = 8386145389216281754L;
public ArrayList<UndoableEdit> getEdits()
{
ArrayList<UndoableEdit> listEdits = new ArrayList<UndoableEdit>();
listEdits.addAll(this.edits);
return listEdits;
}
public void setEdits(ArrayList<UndoableEdit> listEdits)
{
for(UndoableEdit ue:listEdits)
{
this.addEdit(ue);
}
}
}
在我的主窗口类中调用这些函数:
tabbedPane_editeur.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
if (e.getSource() instanceof JTabbedPane)
{
JTabbedPane pane = (JTabbedPane) e.getSource();
int previousTab = f_principale.this.activeTab;
int activeTab = pane.getSelectedIndex();
System.out.println("Selected paneNo : " + pane.getSelectedIndex() + ", précédent : " + previousTab);
f_principale.this.listEditeurs.get(previousTab).setListEdits( f_principale.this.undoManager.getEdits());
f_principale.this.undoManager.setEdits(f_principale.this.listEditeurs.get(activeTab).getListEdits());
f_principale.this.activeTab = activeTab;
f_principale.this.updateButtons();
}
}
});
public void updateButtons()
{
this.btnUndo.setText(undoManager.getUndoPresentationName());
this.btnRedo.setText(undoManager.getRedoPresentationName());
this.btnUndo.setEnabled(undoManager.canUndo());//returns false
this.btnRedo.setEnabled(undoManager.canRedo());//returns false
}
编辑:(1天后)我今天再次测试了UndoManader,我注意到了一些东西。事实上,手动插入 UndoableEdit 就可以了!但是编辑数量增加得太快以至于无法正常...
我很快就达到了默认限制(100),这就是为什么我昨天认为它根本不起作用:当达到限制时, canUndo() / canRedo() 似乎返回 false 并且当按钮被强制启用时,抛出异常。
也许当我切换标签时,发生了一些错误......但是什么?你有什么主意吗 ?我要去看看这个...