JTextArea Undo Redo等


package jishiben;

import javax.swing.JTextArea;
import java.awt.datatransfer.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.swing.undo.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.event.*;

/**
 * Title: 用JAVA实现Undo、Redo,Copy、Paste、Cut
 * Description:用JAVA实现Undo、Redo,Copy、Paste、Cut Copyright: Copyright (c) 2001
 * Company:
 * 
 * @author :
 * @version 1.0
 */

public class ClipTextArea extends JTextArea implements ClipboardOwner {

	Clipboard strBoard = this.getToolkit().getSystemClipboard();
	UndoManager undo = new UndoManager();
	Document doc = this.getDocument();

	public ClipTextArea() {
		doc.addUndoableEditListener(new UndoableEditListener() {
			public void undoableEditHappened(UndoableEditEvent e) {
				doc_addedit(e);
			}
		});

		addActionMap();
	}

	public void addActionMap() {
		getActionMap().put("Undo_Key", new AbstractAction("Undo") {
			public void actionPerformed(ActionEvent evt) {
				try {
					if (undo.canUndo()) {
						undo.undo();
					}
				} catch (CannotUndoException e) {
				}
			}
		});
		getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo_Key");
		/* void put(Object key, Action action) 
         添加一个 key 到 action 的绑定。 */
		 /*void put(KeyStroke keyStroke, Object actionMapKey) 
         将 keyStroke 的一个绑定添加到 actionMapKey。 */
		
		
		getActionMap().put("Redo", new AbstractAction("Redo") {
			public void actionPerformed(ActionEvent evt) {
				try {
					if (undo.canRedo()) {
						undo.redo();
					}
				} catch (CannotRedoException e) {
				}
			}
		});
		getInputMap().put(KeyStroke.getKeyStroke("control R"), "Redo");

		getActionMap().put("Copy", new AbstractAction("Copy") {
			public void actionPerformed(ActionEvent evt) {
				copy();
			}
		});
		getInputMap().put(KeyStroke.getKeyStroke("control C"), "Copy");

		getActionMap().put("Cut", new AbstractAction("Cut") {
			public void actionPerformed(ActionEvent evt) {
				cut();
			}
		});
		getInputMap().put(KeyStroke.getKeyStroke("control X"), "Cut");

		getActionMap().put("Paste", new AbstractAction("Paste") {
			public void actionPerformed(ActionEvent evt) {
				paste();
			}
		});
		getInputMap().put(KeyStroke.getKeyStroke("control V"), "Paste");

	}

	public void copy() {
		String sCopy = getSelectedText();
		if (sCopy != null) {
			StringSelection sSelection = new StringSelection(sCopy);
			strBoard.setContents(sSelection, this);
		}
	}

	public void cut() {
		String sCopy = getSelectedText();
		if (sCopy != null) {
			StringSelection sSelection = new StringSelection(sCopy);
			strBoard.setContents(sSelection, this);
			this.replaceSelection("");
		}
	}

	public void paste() {
		Transferable sTransf = strBoard.getContents(this);
		if (sTransf != null) {
			try {
				String sPaste = (String) sTransf
						.getTransferData(DataFlavor.stringFlavor);
				this.replaceRange(sPaste, getSelectionStart(),
						getSelectionEnd());
			} catch (UnsupportedFlavorException e) {
			} catch (IOException ioe) {
			}
		}
	}

	public void lostOwnership(Clipboard clipboard, Transferable contents) {

	}

	void doc_addedit(UndoableEditEvent e) {
		undo.addEdit(e.getEdit());
	}

}

转载于:https://my.oschina.net/zhongwenhao/blog/84075

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值