1

编辑:请看帖子的末尾...

首先,请原谅我的英语不好...

我正在尝试用 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 并且当按钮被强制启用时,抛出异常。

也许当我切换标签时,发生了一些错误......但是什么?你有什么主意吗 ?我要去看看这个...

4

1 回答 1

1

您应该为每个选项卡创建一个单独的 UndoManager。

于 2013-12-17T01:52:30.657 回答