⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 undoredomanager.java

📁 制图软件
💻 JAVA
字号:
package com.sunking.tp.util;

import javax.swing.*;
import javax.swing.undo.*;
import javax.swing.event.*;
import java.awt.event.*;

/**
 * <p>Title: </p>
 * <p>Description: 撤消恢复管理器</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
 * @version 1.0
 */

public class UndoRedoManager {
    private static UndoRedoManager defaultManager;
    /**
     * 单件模式取默认的管理器
     * @return
     */
    public static UndoRedoManager getDefault() {
        if (defaultManager == null) {
            defaultManager = new UndoRedoManager();
        }
        return defaultManager;
    }

    private UndoManager manager;
    private UndoableEditSupport support;
    /**
     * 重做动作
     */
    private RedoAction redoAction;
    /**
     * 撤消动作
     */
    private UndoLastAction undoAction;

    private UndoRedoManager() {
        manager = new UndoManager();
        manager.setLimit(1000);
        support = new UndoableEditSupport();
        support.addUndoableEditListener(new UndoableApdater());
        redoAction = new RedoAction();
        undoAction = new UndoLastAction();
        addChangeListener(redoAction);
        addChangeListener(undoAction);
    }
    /**
     * 新建文件时初始化
     */
    public void createNewFile(){
        manager.discardAllEdits();
        fireUndoableEditChanged(new UndoableChangeEvent(manager));
    }
    /**
     * 取得UndoManger
     * @return
     */
    public UndoManager getUndoManager() {
        return manager;
    }
    /**
     * 加入UndoableEdit
     * @param edit
     */
    public void postUndoableEdit(UndoableEdit edit){
        support.postEdit(edit);
    }
    /**
     * 取得撤消事件
     * @return
     */
    public Action getUndoAction() {
        return undoAction;
    }
    /**
     * 取得重做事件
     * @return
     */
    public Action getRedoAction() {
        return redoAction;
    }
    /**
     * <p>Title:UndoableApdater </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
     * @version 1.0
     */
    private class UndoableApdater implements UndoableEditListener {
        public void undoableEditHappened(UndoableEditEvent e) {
            manager.addEdit(e.getEdit());
            fireUndoableEditChanged(new UndoableChangeEvent(manager));
        }
    }

    protected EventListenerList listenerList = new EventListenerList();
    /**
     * 添加UndoableEdit改变监听事件
     * @param l
     */
    public void addChangeListener(UndoableChangeListener l) {
        listenerList.add(UndoableChangeListener.class, l);
    }

    /**
     * 移除UndoableEdit改变监听事件
     * @param l
     */
    public void removeChangeListener(UndoableChangeListener l) {
        listenerList.remove(UndoableChangeListener.class, l);
    }
    /**
     * 激发UndoableEdit改变事件,通知监听者
     * @param e
     */
    protected void fireUndoableEditChanged(UndoableChangeEvent e) {
        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == UndoableChangeListener.class) {
                ( (UndoableChangeListener) listeners[i + 1]).stateChanged(e);
            }
        }
    }
    /**
     * <p>Title: RedoAction</p>
     * <p>Description: 重做事件</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
     * @version 1.0
     */
    class RedoAction extends AbstractAction implements UndoableChangeListener {
        public RedoAction() {
//            super("Redo");
            putValue(Action.SHORT_DESCRIPTION, JTPUtil.getString("Redo"));
            putValue(Action.MNEMONIC_KEY, new Integer('R'));
            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl shift z"));
            update();
        }

        public void actionPerformed(ActionEvent e) {
            manager.redo();
            undoAction.update();
            update();
        }

        public void update() {
            boolean canRedo = manager.canRedo();

            if (canRedo) {
                setEnabled(true);
                putValue(Action.SHORT_DESCRIPTION,
                    manager.getRedoPresentationName());
            } else {
                setEnabled(false);
                putValue(Action.SHORT_DESCRIPTION, JTPUtil.getString("Redo"));
            }
        }

        public void stateChanged(UndoableChangeEvent e) {
            update();
        }
    }
    /**
     * <p>Title: UndoLastAction</p>
     * <p>Description: 撤消事件</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
     * @version 1.0
     */
    class UndoLastAction extends AbstractAction implements UndoableChangeListener {
        public UndoLastAction() {
//            super("Undo");
            putValue(Action.SHORT_DESCRIPTION, JTPUtil.getString("Undo"));
            putValue(Action.MNEMONIC_KEY, new Integer('U'));
            putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl z"));
            update();
        }

        public void actionPerformed(ActionEvent e) {
            manager.undo();
            redoAction.update();
            update();
        }

        public void update() {
            boolean canUndo = manager.canUndo();
            if (canUndo) {
                setEnabled(true);
                putValue(Action.SHORT_DESCRIPTION,
                    manager.getUndoPresentationName());
            } else {
                setEnabled(false);
                putValue(Action.SHORT_DESCRIPTION, JTPUtil.getString("Undo"));
            }
        }

        public void stateChanged(UndoableChangeEvent e) {
            update();
        }

    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -