Java剪贴板可用性

Java剪贴板可用性,java,netbeans,clipboard,Java,Netbeans,Clipboard,当我在互联网上研究东西时,我喜欢复制和粘贴某些段落,这样我以后就可以回顾它们了 我正在尝试编写一个程序,该程序将持续检查剪贴板中的文本内容,并在更新时将其写入文本文件 在下面的程序测试中,在运行程序之前,我的剪贴板中有“public class Clipboard”,当程序运行时,我从netbeans(用于运行程序的IDE)复制文本时发生异常: import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java

当我在互联网上研究东西时,我喜欢复制和粘贴某些段落,这样我以后就可以回顾它们了

我正在尝试编写一个程序,该程序将持续检查剪贴板中的文本内容,并在更新时将其写入文本文件

在下面的程序测试中,在运行程序之前,我的剪贴板中有“public class Clipboard”,当程序运行时,我从netbeans(用于运行程序的IDE)复制文本时发生异常:

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
公共类测试剪贴板
线程“main”java.lang.IllegalStateException中出现异常:无法打开系统剪贴板
位于sun.awt.windows.WClipboard.openClipboard(本机方法)
在sun.awt.datatransfer.ClipboardTransferable.(ClipboardTransferable.java:78)
位于sun.awt.datatransfer.sunciplater.getContents(sunciplater.java:144)
位于delete.TestClipboard.main(TestClipboard.java:21)
Java结果:1
生成成功(总时间:34秒)

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


getSystemClipboard()方法是否没有全局作用域?-换句话说,如果复制操作是在internet浏览器中执行的,我能否获取剪贴板的内容

当另一个进程正在更新剪贴板(或类似进程)时,您似乎正在尝试从剪贴板中读取

我的修正案如下:

  • 在循环中请求
    剪贴板的实例
  • 线程.sleep
    添加到
    while循环中
  • 例如

    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) {
                }
            }
        }   
    }
    

    应该注意的是,它不会阻止它的发生,它只会减少发生的次数。当它被抛出时,你可以(忽略)忽略和重试……/p>而不是垃圾邮件剪贴板,考虑添加<代码>线程。你有什么特别的理由选择40毫秒作为睡眠时间吗?不完全是,通常用于动画(25帧/秒);)