java文字的撤銷和恢復
文字的撤銷和恢復是通過 addUndoableEditListener(UndoableEditListener listener)這個方法來註冊實現的。只要是Document類及其子類都可以註冊撤銷和恢復的監聽來實現文件的撤銷和恢復,這是非常容易實現的。所以JTextField,JTextArea,JTextPane都可以實現撤銷和恢復功能。因為他們都可以獲得Document例項,通過這個方法----getDocument();下面來用例項來講解一下。
下面的例項是在一個JTextPane中實現撤銷和恢復,通過右鍵彈出選單來操作。彈出選單的第一個選單項是"撤銷",第二個是"恢復",第三個是"插入圖片"。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextPane;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoManager;
import com.jijing.tool.SwingConsole;
public class UndoFunction extends JFrame{
/**
* @param args
* 實現簡單的撤銷功能,並通過Ctrl+Z快捷鍵來快速操作,這次是在一個文字面板中,既可以寫文字又可以插入圖片,可以撤銷也可以恢復
* 通過滑鼠右鍵來彈出選單實現撤銷和恢復的操作
*/
private UndoManager um;//撤銷管理類
private JTextPane jp;//文字面板
private String name[]={
"撤銷",
"恢復",
"插入圖片"
};
private JPopupMenu pm;//右鍵彈出選單類
private JMenuItem mt[];
public UndoFunction(){
um=new UndoManager();
jp=new JTextPane();
pm=new JPopupMenu();
mt=new JMenuItem[3];
for(int i=0;i<3;++i){
mt[i]=new JMenuItem(name[i]);
pm.add(mt[i]);
mt[i].addActionListener(new PopupAction());
}
add(jp);
jp.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e){
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e){
if(e.isPopupTrigger()){//如果有彈出選單
pm.show(e.getComponent(), e.getX(), e.getY());
}
}
});
jp.getDocument().addUndoableEditListener(new UndoableEditListener(){//註冊撤銷可編輯監聽器
public void undoableEditHappened(UndoableEditEvent e) {
um.addEdit(e.getEdit());
}
});//編輯撤銷的監聽
}
public static void main(String[] args) {
SwingConsole.swingRun(new UndoFunction(),600,400);
}
class PopupAction implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(e.getSource()==mt[0]&&um.canUndo()){//撤銷
um.undo();
}else if(e.getSource()==mt[1]&&um.canRedo()){//恢復
um.redo();
}else if(e.getSource()==mt[2]){//插入圖片
ImageIcon icon=new ImageIcon(getClass().getResource("/1.png"));
jp.insertIcon(icon);
}
}
}
}
其實對於文件編輯的撤銷和恢復是非常簡單的,只要獲取getDocument()就可以實現監聽了,在監聽方法中新增編輯資料就可以了,
UndoManager .addUndoableEditListener(UndoableEditEvent .getEdit());
在就是在撤銷操作中呼叫UndoManager .undo()就可以了,還有canUndo()這個方法和重要,用於判斷undo操作是否成功,如果成功就返回true。
在恢復操作中呼叫UndoManager .redo()可以實現恢復,還有canRedo()方法判斷redo操作是否成功,如果成功返回true。
//下面講解的是 如果沒有提供addUndoableEditListener()方法怎麼實現撤銷和恢復操作