加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

实现文本的复制和粘贴、文本的撤销和恢复(用JTextArea)

(2010-11-24 23:26:12)
标签:

杂谈

文本的撤销和恢复

Swing UI 2010-07-08 18:51:58 阅读51 评论0   字号: 订阅

文本的撤销和恢复是通过 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{

   
    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。

 

//另一个版本

作文本编辑器的时候,撤销(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();

}

 

这样一来,文本编辑器的撤销、恢复功能很容易地就实现了。以下是一个例子:


view plaincopy to clipboardprint?
01.import java.awt.*;  
02.import java.awt.event.*;  
03.import javax.swing.*;  
04.import javax.swing.undo.*;  
05. 
06.class UndoDemo extends JFrame {  
07. 
08.    static JTextArea text = new JTextArea();  
09.    static JPanel pnl = new JPanel();  
10.    static JButton unbtn = new JButton("撤销");  
11.    static JButton rebtn = new JButton("恢复");  
12.    static UndoManager undomg = new UndoManager();  
13. 
14.    UndoDemo() {  
15. 
16.        super("撤销、恢复功能实例");  
17.        setVisible(true);  
18.        setSize(400,300);  
19.        setLocationRelativeTo(null);  
20.        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
21.        setLayout(new BorderLayout(5,5));  
22. 
23.        pnl.setLayout(new FlowLayout(5));  
24.        pnl.add(unbtn);  
25.        pnl.add(rebtn);  
26.        add(pnl,BorderLayout.NORTH);  
27.        add(text,BorderLayout.CENTER);  
28. 
29.        text.getDocument().addUndoableEditListener(undomg);  
30. 
31.        unbtn.addActionListener(new ActionListener() {  
32.            public void actionPerformed(ActionEvent evt) {  
33.                if(undomg.canUndo()) {  
34.                    undomg.undo();  
35.                } else {  
36.                    JOptionPane.showMessageDialog(null,"无法撤销","警告",JOptionPane.WARNING_MESSAGE);  
37.                 
38.             
39.        });  
40. 
41.        rebtn.addActionListener(new ActionListener() {  
42.            public void actionPerformed(ActionEvent evt) {  
43.                if(undomg.canRedo()) {  
44.                    undomg.redo();  
45.                } else {  
46.                    JOptionPane.showMessageDialog(null,"无法恢复","警告",JOptionPane.WARNING_MESSAGE);  
47.                 
48.             
49.        });  
50.     
51. 
52.    public static void main(String[] args) {  
53.        new UndoDemo();  
54.     
55.}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ProComFan/archive/2010/01/03/5124501.aspx

 

实现文本的复制和粘贴(用JTextArea)

只要是JTextComponent类以及其子类都具备文本的复制和粘贴功能。是使用了下面的三个方法。

copy():复制方法,可以通过鼠标来选定文本来复制。通过复制到的数据是放到剪贴板上的,和操作系统相互应的。也就是说通过复制操作系统也可以使用这个剪贴板中的数据。

cut():剪切

paste():粘贴

还有一个有用的方法:

getSelectedText():返回选择的内容,如果用户没有选中任何内容或者文档中没有一个内容就返回null,如果有就返回String

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有