11.9.2 传递文本

11.9.2 传递文本

传递文本是最简单的情形,因为AWT已经提供了一个StringSelection用于传输文本字符串。

将文本放入剪贴板

将一段文本内容(字符串对象)放进剪贴板中的步骤如下。

1. 创建一个Clipboard实例

既可以创建系统剪贴板,也可以创建本地剪贴板。

创建系统剪贴板通过如下代码:

1
Clipboard clipboard= Toolkit.getDefaultToolkit().getSystemClipboard();

创建本地剪贴板通过如下代码:

1
Clipboard clipboard =new Clipboard("cb");

2. 将需要放入剪贴板中的字符串封装成StringSelection对象

如下代码所示:

1
StringSelection st =new StringSelection(targetStr);

3. 调用setContents方法

调用剪贴板对象的setContents()方法将StringSelection放进剪贴板中,该方法需要两个参数,

  • 第一个参数是Transferable对象,代表放进剪贴板中的对象;
  • 第二个参数是ClipboardOwner对象,代表剪贴板数据的持有者,通常无须关心剪贴板数据的持有者,所以把第二个参数设为null
1
clipboard.setContents(st,null);

从剪贴板中取出数据

从剪贴板中取出数据则比较简单,调用Clipboard对象的getData(DataFlavor flavor);方法即可取出剪贴板中指定格式的内容,如果指定flavor的数据不存在,该方法将引发UnsupportedFlavorException异常。为了避免出现异常,可以先调用Clipboard对象的isDataFlavorAvailable(DataFlavor flavor);方法来判断指定flavor的数据是否存在。如下代码所示:

1
2
3
4
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor))
{
String content =(String)clipboard.getData(DataFlavor.stringFlavor));
}

实例

下面程序是一个利用系统剪贴板进行复制、粘贴的简单程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
public class SimpleClipboard
{
private Frame f = new Frame("简单的剪贴板程序");
// 获取系统剪贴板
private Clipboard clipboard = Toolkit
.getDefaultToolkit().getSystemClipboard();
// 下面是创建本地剪贴板的代码
// Clipboard clipboard = new Clipboard("cb"); // ①
// 用于复制文本的文本框
private TextArea jtaCopyTo = new TextArea(5,20);
// 用于粘贴文本的文本框
private TextArea jtaPaste = new TextArea(5,20);
private Button btCopy = new Button("复制"); // 复制按钮
private Button btPaste = new Button("粘贴"); // 粘贴按钮
public void init()
{
Panel p = new Panel();
p.add(btCopy);
p.add(btPaste);
btCopy.addActionListener(event ->
{
// 将一个多行文本域里的字符串封装成StringSelection对象
StringSelection contents = new
StringSelection(jtaCopyTo.getText());
// 将StringSelection对象放入剪贴板
clipboard.setContents(contents, null);
});
btPaste.addActionListener(event ->
{
// 如果剪贴板中包含stringFlavor内容
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor))
{
try
{
// 取出剪贴板中stringFlavor内容
String content = (String)clipboard
.getData(DataFlavor.stringFlavor);
jtaPaste.append(content);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
// 创建一个水平排列的Box容器
Box box = new Box(BoxLayout.X_AXIS);
// 将两个多行文本域放在Box容器中
box.add(jtaCopyTo);
box.add(jtaPaste);
// 将按钮所在Panel、Box容器添加到Frame窗口中
f.add(p,BorderLayout.SOUTH);
f.add(box,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public static void main(String[] args)
{
new SimpleClipboard().init();
}
}

上面程序中“复制”按钮的事件监听器负责将第一个文本域的内容复制到系统剪贴板中,“粘贴”按钮的事件监听器则负责取出系统剪贴板中的stringFlavor内容,并将其添加到第二个文本域内。运行上面程序,将看到如图11.32所示的结果。

因为程序使用的是系统剪贴板,因此可以通过Windows的剪贴簿查看器来查看程序放入剪贴板中的内容。在Windows的“开始”菜单中运行“clipbrd”程序,将可以看到如图11.33所示的窗口。

提示:
Windows7系统已经删除了默认的剪贴板查看器,因此读者可以到WindowsXPC:\windows\system32\目录下将clipbrd.exe文件复制过来。