在JTextArea中实现Redo和Undo功能,其实真正操控Undo、Redo功能的是Document、UndoManager,下面是实现代码:
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.event.UndoableEditEvent; import javax.swing.text.Document; import javax.swing.undo.UndoManager; /** * 在JTextArea中实现Redo和Undo功能 * @author 五斗米 <如转载请保留作者和出处> * @blog http://blog.csdn.net/mq612 */ public class Test extends JFrame { private static final long serialVersionUID = -2397593626990759111L; private JPanel pane = null; private JButton undo = null, redo = null; private JScrollPane sPane = null; private JTextArea text = null; private Document doc = null; private UndoManager undomang = null; public Test() { super("Redo and Undo"); undomang = new UndoManager(){ private static final long serialVersionUID = -5960092671497318496L; public void undoableEditHappened(UndoableEditEvent e) { this.addEdit(e.getEdit()); } }; text = new JTextArea(); doc = text.getDocument(); redo = new JButton(">>"); undo = new JButton("<<"); undo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (undomang.canUndo()) undomang.undo(); } }); redo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (undomang.canRedo()) undomang.redo(); } }); pane = new JPanel(); pane.add(undo); pane.add(redo); doc.addUndoableEditListener(undomang); sPane = new JScrollPane(text); this.getContentPane().add(sPane); this.getContentPane().add(pane, BorderLayout.NORTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300, 200); this.setVisible(true); } public static void main(String args[]) { new Test(); } } |