在Java之外,剪贴板内容发生变化时是否可能得到通知?

15

我想做的事情是,当用户在任何程序中复制文本(如firefox、记事本、pdf阅读器等),我的已经运行的Java应用程序将被通知并立即显示一个弹出窗口。

我认为为了能够做到这一点,当系统剪贴板更改时应该调用我的Java应用程序。

Java是否可以实现这一点?如果可以,在哪个版本中?我知道我们可以访问和操作系统剪贴板内容,但我的具体问题是当剪贴板内容更改时如何调用Java应用程序。

谢谢

1个回答

8

我曾天真地以为这是JDIC的一项工作,但网络告诉了我真相。所以,让我解释一下。

使用Toolkit.getSystemClipboard(),您可以访问原生系统剪贴板。像任何Java对象一样,此剪贴板可以被监听。确切地说,您可以调用Clipboard.addFlavorListener(...)来监听FlavorEvents。它们是什么?他们是金属之王!....不不不,我完全离题了。让我回来。因此,根据文档,FlavorEvent表示

剪贴板(事件源)中可用的DataFlavors已更改。

可能意味着剪贴板内容发生了变化。但是,我不会在没有第一个原型的情况下直接使用它。

编辑来自AlexR的原型示例:

import java.awt.Toolkit;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;

public class Main {
    public static void main(String[] args) throws Exception { 
        Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(new FlavorListener() { 
            @Override 
            public void flavorsChanged(FlavorEvent e) { 
                System.out.println("changed!!! " + e.getSource() + " " + e.toString()); 
            } 
        }); 
        Thread.sleep(100000L); 
    }
}

1
有趣,但如果内容更改而DataFlavors未更改,这个代码是否会触发呢?我在想。 - bdonlan
1
这就是为什么我说必须制作一个原型 :-) 它不是一个经过验证的解决方案,只是对最简单可能的解决方案的提示。 - Riduidel
2
我刚刚尝试了这个,真的有效!谢谢@Riduidel!这是我的代码:public static void main(String[] args) throws Exception { Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(new FlavorListener() { @Override public void flavorsChanged(FlavorEvent e) { System.out.println("changed!!! " + e.getSource() + " " + e.toString()); } }); Thread.sleep(100000L); } - AlexR
5
这种方法仅适用于一次从应用程序复制一个项目的情况。如果在同一应用程序中再次复制,Flavor事件将不会更改。通过监视剪贴板所有者的更改来进行监控将更可靠。以下是详细信息:https://dev59.com/a1XTa4cB1Zd3GeqP4Le0 - Yu Shen
1
如果复制了相同类型的新数据,则此方法无效。 - Boann
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接