java文本的撤销和恢复

搬家后的博客链接: IT客栈 www.itkezhan.org


文本的撤销和恢复是通过 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()方法怎么实现撤销和恢复操作

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文本撤销恢复功能可以使用Java Swing中提供的UndoManager类。该类是一个管理撤销恢复操作的类,可以用来实现文本编辑器中的撤销恢复功能。 下面是一个简单的示例代码,演示如何使用UndoManager实现文本撤销恢复功能: ```java import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import javax.swing.undo.*; public class TextEditor extends JFrame { private JTextArea textArea; private UndoManager undoManager; public TextEditor() { textArea = new JTextArea(); undoManager = new UndoManager(); // 添加撤销恢复操作监听器 textArea.getDocument().addUndoableEditListener(new UndoableEditListener() { public void undoableEditHappened(UndoableEditEvent e) { undoManager.addEdit(e.getEdit()); } }); // 添加菜单项和快捷键 JMenuBar menuBar = new JMenuBar(); JMenu editMenu = new JMenu("编辑"); JMenuItem undoItem = new JMenuItem("撤销"); undoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK)); undoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (undoManager.canUndo()) { undoManager.undo(); } } }); JMenuItem redoItem = new JMenuItem("恢复"); redoItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK)); redoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (undoManager.canRedo()) { undoManager.redo(); } } }); editMenu.add(undoItem); editMenu.add(redoItem); menuBar.add(editMenu); setJMenuBar(menuBar); add(new JScrollPane(textArea)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String[] args) { new TextEditor(); } } ``` 在上述代码中,我们首先创建了一个JTextArea和一个UndoManager对象。然后,我们为JTextArea的Document添加了一个UndoableEditListener,监听文本编辑操作。每次用户进行文本编辑时,就会产生一个UndoableEditEvent事件,我们将该事件加入到UndoManager中,以便后续进行撤销恢复操作。 接着,我们创建了一个菜单栏,并添加了“撤销”和“恢复”两个菜单项,分别对应undoManager的undo()和redo()方法。我们还为这两个菜单项添加了快捷键,方便用户使用。 最后,我们将JTextArea添加到JScrollPane中,并将其添加到窗口中显示。当用户进行文本编辑操作时,可以使用菜单栏或快捷键进行撤销恢复操作。 希望这个示例代码对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值