Java應用技巧——文字撤銷、恢復功能的實現
作文字編輯器的時候,撤銷(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();
}
這樣一來,文字編輯器的撤銷、恢復功能很容易地就實現了。以下是一個例子:
執行效果如下: