1. 程式人生 > >java文字的撤銷和恢復

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()方法怎麼實現撤銷和恢復操作