无法执行多个撤消操作

时间:2012-07-13 13:07:56

标签: java undo

我正在努力让我的第一个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();行时,它可以正常工作,但每次点击撤消只会撤消一个单独的编辑,就像一个键入的字母一样。我想撤消一组单个编辑,以便undoManager.end();在这一点上有意义。但是,在第一次单击撤消后,我无法重新开始跟踪单个编辑。 (希望你能理解)

1 个答案:

答案 0 :(得分:0)

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