【问题标题】:Unable to perform more than one undo无法执行多个撤消操作
【发布时间】:2012-07-13 08:14:58
【问题描述】:

我正在尝试让我的第一个 UndoManager 工作,但我的原型有问题。我不明白为什么下面的代码只提供一个撤消。

当我更改文本时,单击撤消并再次更改文本,另一个撤消将不起作用。问题在哪里?

import java.awt.*;
import javax.swing.*;

public class IComeUndone
{
    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextArea textArea = new JTextArea(20, 40);
        textArea.setText("Back here");
        f.add(textArea);
        final UndoManager undoManager = new UndoManager();
        textArea.getDocument().addUndoableEditListener(undoManager);
        undoManager.setLimit(1000);
        JButton undoB = new JButton("Undo");
        undoB.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                undoManager.end();
                if(undoManager.canUndo())
                {
                    undoManager.undo();
                }
                textArea.requestFocus();
            }
        });
        f.add(undoB, BorderLayout.PAGE_END);
        f.pack();
        f.setVisible(true);
    }
}

更新: 当我注释掉 undoManager.end(); 行时,它工作正常,但每次点击 undo 只会撤消一次编辑,就像一个键入的字母。我想撤消一组单个编辑,以便 undoManager.end(); 在这一点上有意义。但是在第一次单击撤消后,我无法重新开始跟踪单个编辑。 (希望你能理解)

【问题讨论】:

  • 你的 MyUndoManager 是如何实现的?
  • 是一个内部类,向下滚动代码sn -p即可。但是和普通的UndoManager没什么区别。
  • 这是如何确定的 undoManager.canUndo() 看起来返回 false。
  • Java-API:如果可以撤消编辑,则返回 true。如果 end 已被调用,这将返回 super 的值。否则,如果有任何要撤消的编辑,则返回 true(editToBeUndone 返回非 null)。
  • 浏览api docs。你不应该在.undo()之后打电话给.end()吗?

标签: java undo


【解决方案1】:

有趣的是,似乎一旦您调用 end(),它会将 UndoManager 转换为 CompoundEdit,然后您需要做更多的工作。以下链接为例:http://tips4java.wordpress.com/2008/10/27/compound-undo-manager/

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多