Java剪贴板可用性

时间:2014-12-03 05:29:21

标签: java netbeans clipboard

当我在互联网上研究东西时,我喜欢复制并粘贴某些段落,以便稍后查看。

我正在尝试编写一个程序,该程序会不断检查剪贴板中的文本内容,并在任何续订时将其写入文本文件。

在下面的程序测试中,我在运行程序之前在我的剪贴板中有“公共类剪贴板”,当我从netbeans复制文本时发生异常(我用来运行程序运行时:

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class TestClipboard {


    public static void main(String[] args) {
        Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
        String initial = "";
        while(true) {
            try {
                String paste = c.getContents(null).getTransferData(DataFlavor.stringFlavor).toString();
                if(!paste.equals(initial)) {
                    System.out.println(paste);
                    initial = paste;
                }
            } catch (UnsupportedFlavorException | IOException ex) {
                Logger.getLogger(TestClipboard.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

输出:

public class TestClipboard
Exception in thread "main" java.lang.IllegalStateException: cannot open system clipboard
    at sun.awt.windows.WClipboard.openClipboard(Native Method)
    at sun.awt.datatransfer.ClipboardTransferable.<init>(ClipboardTransferable.java:78)
    at sun.awt.datatransfer.SunClipboard.getContents(SunClipboard.java:144)
    at delete.TestClipboard.main(TestClipboard.java:21)
Java Result: 1

建立成功(总时间:34秒)

为什么不能打开系统剪贴板?

getSystemClipboard()方法是否没有全局范围? - 换句话说,如果在互联网浏览器中执行复制操作,是否可以获取剪贴板的内容?

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试从剪贴板读取,而另一个进程正在更新(或某些此类)。

我修复:

  1. 在循环中请求Clipboard的实例
  2. Thread.sleep
  3. 中添加while-loop

    例如......

    public class TestClipboard {
    
        public static void main(String[] args) {
    
            String initial = "";
            while (true) {
                try {
                    Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
                    String paste = c.getContents(null).getTransferData(DataFlavor.stringFlavor).toString();
                    if (!paste.equals(initial)) {
                        System.out.println(paste);
                        initial = paste;
                    }
                } catch (UnsupportedFlavorException | IOException ex) {
                    Logger.getLogger(TestClipboard.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    Thread.sleep(40);
                } catch (InterruptedException ex) {
                }
            }
        }   
    }
    

    应该注意的是,它不会阻止它发生,它只会减少发生的次数。当它被抛出时,你可以(只是)忽略并再试一次......