Java應用技巧——文本撤銷、恢複功能的實現

來源:互聯網
上載者:User

作文字編輯器的時候,撤銷(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 />}

運行效果如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.