AWT 支持两种剪贴板:本地剪贴板和系统剪贴板。如果在同一个虚拟机的不同窗口之间进行数据传递,则使用AWT自已的本地剪贴板即可。如果需要在不同的虚拟机之间传递数据,或者要在java程序与第三方程序之间传递数据,就需要使用系统剪贴板了。
数据传递的类和接口:
AWT中剪贴板相关操作的接口和类放在java.awt.datatransfer包下。
Clipboard:代表一个剪贴板实例,系统剪贴板 或 本地剪贴板。
ClipboardOwner:剪贴板内容的所有者接口,当剪贴板内容的所有权被修改
时,系统会触发该所有者的lostOwnership事件处理器。
Transferable:该接口的实例代表放进剪贴板中的传输对象。
DataFlavoer:用于表述剪贴板中的数据格式。
StringSelection:Tranferable的实现类,用于传输文本字符串。
FlavoerListener:数据格式监听器接口。
FlavoerEvent:该类的实例封装了数据格式改变的事件。
传递文本:
1.创建一个Clipboard实例,系统剪贴板 或 本地剪贴板。
创建系统剪贴板代码:
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
创建本地剪贴板代码:
Clipboard clipboard = new Clipboard(“cb”);
2.将需要放入剪贴板中的字符串封装成StringSelection对象:
StringSelection st = new StringSelection(targetStr);
3.调用剪贴板对象的setContents()方法将StringSelection放进剪贴板中,该方法需要两个参数,第一个是Transferable对象,代表放进剪贴板中的对象。第二个参数是ClipboardOwner对象,代表剪贴板数据的所有者,通常我们无须关心剪贴板数据的所有者,所以可以所第二个参数设为null.
clipboard.setContents(st, null);
从剪贴板中取出数据:
调用Clipboard对象的getData(DataFlavor flavor)方法即可取出剪贴板中指定格式的内容,如果指定flavor的数据不存在,该方法将引发UnsupportedFlavorException异常。为避免出现异常,可以先调用Clipboard对象的isDataFlavorAvaliable(DataFlavor flavor)来判断指定的数据是否存在:
if (clipboard.isDataFlavorAvaliable(DataFlavor.stringFlavor)) {
String content = (String)clipable.getData(DataFlavor.stringFlavor);
}
系统剪贴板进行复制,粘贴实例:
package javaAWT;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.Box;
import javax.swing.BoxLayout;
public class SimpleClipboard {
private Frame frame = new Frame("SimpleClipboard");
// 获取系统剪切板
private Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 创建本地剪切板
//Clipboard clipboard2 = new Clipboard("cb");
// 用于复制文本的文本框
private TextArea jtaCopyTo = new TextArea(5, 20);
// 用于粘贴文本的文本框
private TextArea jtaPaste = new TextArea(5, 20);
private Button btnCopy = new Button("Copy");
private Button btnPaste = new Button("Paste");
public void init() {
Panel panel = new Panel();
panel.add(btnCopy);
panel.add(btnPaste);
btnCopy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 将一个多行文本域里的字符串封装成StringSelection对象
StringSelection contents = new StringSelection(jtaCopyTo.getText());
// 将StringSelection对象入放剪切板中
clipboard.setContents(contents, null);
}
});
btnPaste.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 如果剪切板包含stringFlavor内容
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
String content;
try {
content = (String)clipboard.getData(DataFlavor.stringFlavor);
jtaPaste.append(content);
} catch (UnsupportedFlavorException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
super.windowClosing(e);
System.exit(0);
}
});
// 创建一个水平排列的Box容器
Box box = new Box(BoxLayout.X_AXIS);
// 将两个多行文本域放在box容器中
box.add(jtaCopyTo);
box.add(jtaPaste);
// 将按钮的在的Panel , Box容器添加到Frame窗口中
frame.add(panel, BorderLayout.SOUTH);
frame.add(box, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new SimpleClipboard().init();
}
}