作文字編輯器的時候,撤銷(undo)、恢複(redo)是必不可少的兩個功能。實現這個功能,要用到javax.swing.undo包中的UndoManager類。
UndoManager類有如下常用方法:
boolean canUndo() ——判斷能否進行撤消操作,可以則返回true。
boolean canRedo() ——判斷能否進行恢複操作,可以則返回true。
void Undo() ——進行撤消操作。
void Redo() ——進行恢複操作。
但是,進行撤銷、恢複操作前還應為撤銷、恢複的對象註冊接聽程式。在文字編輯器中,對象就是文本。例如先聲明兩個對象:
JTextArea text = new JTextArea();
UndoManager undomg = new UndoManager();
接下來,為text添加接聽程式:
text.getDocument().addUndoableEditListener(undomg);
這裡要說名一下,之所以要寫getDocument()是因為註冊接聽程式的對象是文本,不是文字框。addUndoableEditListener(undomg)的作用是為text的文本註冊接聽程式,該方法的原型是:
void addUndoableEditListener(UndoableEditListener listener)
可以看出,該方法的參數應是一個UndoableEditListener介面類型的參數,而我們用的參數是UndoManager類型,這是因為UndoManager類已經實現了UndoableEditListener介面的緣故。
現在就可以進行撤銷、恢複操作了。方法是:
undomg.Undo(); //撤銷
undomg.Redo(); //恢複
但是這樣不算完美,因為如果無法撤銷或恢複,這兩個語句就不會起任何作用。因此我們改用如下方法:
if(undomg.canUndo()) { //撤銷
undomg.Undo();
}
if(undomg.canRedo()) { //恢複
undomg.Redo();
}
這樣一來,文字編輯器的撤銷、恢複功能很容易地就實現了。以下是一個例子:
import java.awt.*;<br />import java.awt.event.*;<br />import javax.swing.*;<br />import javax.swing.undo.*;</p><p>class UndoDemo extends JFrame {</p><p> static JTextArea text = new JTextArea();<br /> static JPanel pnl = new JPanel();<br /> static JButton unbtn = new JButton("撤銷");<br /> static JButton rebtn = new JButton("恢複");<br /> static UndoManager undomg = new UndoManager();</p><p> UndoDemo() {</p><p> super("撤銷、恢複功能執行個體");<br /> setVisible(true);<br /> setSize(400,300);<br /> setLocationRelativeTo(null);<br /> setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br /> setLayout(new BorderLayout(5,5));</p><p> pnl.setLayout(new FlowLayout(5));<br /> pnl.add(unbtn);<br /> pnl.add(rebtn);<br /> add(pnl,BorderLayout.NORTH);<br /> add(text,BorderLayout.CENTER);</p><p> text.getDocument().addUndoableEditListener(undomg);</p><p> unbtn.addActionListener(new ActionListener() {<br /> public void actionPerformed(ActionEvent evt) {<br /> if(undomg.canUndo()) {<br /> undomg.undo();<br /> } else {<br /> JOptionPane.showMessageDialog(null,"無法撤銷","警告",JOptionPane.WARNING_MESSAGE);<br /> }<br /> }<br /> });</p><p> rebtn.addActionListener(new ActionListener() {<br /> public void actionPerformed(ActionEvent evt) {<br /> if(undomg.canRedo()) {<br /> undomg.redo();<br /> } else {<br /> JOptionPane.showMessageDialog(null,"無法恢複","警告",JOptionPane.WARNING_MESSAGE);<br /> }<br /> }<br /> });<br /> }</p><p> public static void main(String[] args) {<br /> new UndoDemo();<br /> }<br />}
運行效果如下: