import java.awt.*; import java.awt.event.*; import javax.swing.*; /*由于会使用到复原和事件驱动功能,因此需要将javax.swing.undo和javax.swing.event两个package包含进来 */ import javax.swing.undo.*; import javax.swing.event.*; /*JTextArea4类继承JFrame类并实作UndoableEditListener interface.实作UndoableEditListener interface就必须要编写其中的 *undoableEditHappened(). */ public class JTextArea4 extends JFrame implements UndoableEditListener{ private UndoableEdit edit; private JTextArea jta; private JTextArea message; private JMenuItem undoitem; private JMenuItem redoitem; public JTextArea4(){ super("JTextArea4"); jta = new JTextArea(); jta.getDocument().addUndoableEditListener(this);//将JTextArea加入UndoableEditListener. message = new JTextArea(); message.setEditable(false);//利用setEditable()方法将另一个JTextArea设置为不可编辑. JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(1,1)); p1.setBorder(BorderFactory.createTitledBorder("Edit Area")); p1.add(new JScrollPane(jta)); //--begin:分别将两个JTextArea通过JPanel放到JFrame中。 JPanel p2 = new JPanel(); p2.setLayout(new GridLayout(1,1)); p2.setBorder(BorderFactory.createTitledBorder("Message")); p2.add(new JScrollPane(message)); getContentPane().setLayout(new GridLayout(2,1)); getContentPane().add(p1); getContentPane().add(p2); //--end //建立目录菜单并放置到JFrame中. JMenuBar bar = new JMenuBar(); JMenu theMenu = new JMenu("Edit"); undoitem = new JMenuItem("Undo"); redoitem = new JMenuItem("Redo"); theMenu.add(undoitem); theMenu.add(redoitem); bar.add(theMenu); updateMenuItem();//构造目录菜单 setJMenuBar(bar); setSize(300,300); //采用inner class方式,分别构造菜单选项被点选后的运行操作。分别调用undo(),redo()方法来完成. undoitem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ edit.undo(); updateMenuItem();//运行undo功能 message.append("- Undo -\n"); } }); redoitem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ edit.redo(); updateMenuItem();//运行redo功能 message.append("- Redo -\n"); } }); }//end of JTextArea4() public void undoableEditHappened(UndoableEditEvent ev){ StringBuffer buf = new StringBuffer(200); /*当用户在Text Area中有所操作时,就可以用getEdit()方法取得UndoableEdit对象,此对象纪录着刚刚用户的操作,因 *此可由些对象的undo()或redo()达到取消或复原的功能. */ edit = ev.getEdit(); buf.append("undoableEdit:"); buf.append(edit.getPresentationName()); buf.append("\n"); message.append(buf.toString()); updateMenuItem(); }//end of undoableEditHappened() //判断是否此时是否可以运行undo或redo的功能,并且改变目录菜单的状态值. public void updateMenuItem(){ if (edit != null){ undoitem.setEnabled(edit.canUndo()); redoitem.setEnabled(edit.canRedo()); undoitem.setText(edit.getUndoPresentationName()); redoitem.setText(edit.getRedoPresentationName()); }else{ undoitem.setEnabled(false); redoitem.setEnabled(false); undoitem.setText("Undo"); redoitem.setText("Redo"); } }//end of updateMenu() public static void main(String args[]) { JFrame f = new JTextArea4(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.show(); }//end of main() }//end of class JTextArea4