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();
    }
}

这里写图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐