Java 剪贴板可用性

标签 java netbeans clipboard

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

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

在下面的程序测试中,运行程序之前,我的剪贴板中有“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

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

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

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

最佳答案

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

我修复了:

  1. 在循环中请求剪贴板实例
  2. Thread.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) {
            }
        }
    }   
}

需要注意的是,它不会阻止它发生,只会减少发生的次数。当它被抛出时,你可以(几乎)忽略并重试......

关于Java 剪贴板可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264303/

相关文章:

c# - 启用复制的通用应用程序 Windows Phone TextBox.SelectAll() 不起作用

c# - 如何在 C# 中从剪贴板保存 RTF 文件?

java - 在 Selenium GhostDriver 中使用 JavascriptExecutor 处理警报/确认

java - 如何在netbeans gui编辑器中将JPanel分配给JFrame?

java - 带 Rest 的 Tomcat - HTTP 状态 500 - Servlet 执行抛出异常

java - 如何将 BorderLayout 与 Netbeans Matisse 一起使用

javascript - 复制到剪贴板在 JavaScript 代码中不起作用,但在 Chrome 控制台上起作用

java - 是否有一种有效的算法可以将几组数字打包到几个桶中?

java - 在 CloudFoundry WAR 部署中排除某些 WebApplicationInitializers

java - Hibernate Search、Lucene 或任何其他替代方案?