使用JavaFx在系统剪贴板上侦听

使用JavaFx在系统剪贴板上侦听,java,javafx,clipboard,javafx-8,Java,Javafx,Clipboard,Javafx 8,如回答此问题时所述,可以设置时间线来检查系统剪贴板中是否有更改: 但是有更好的办法吗?例如,事件侦听器?我搜索了JavaFX8文档,没有发现任何明显有用的东西 首选使用JavaFx的解决方案,但欢迎所有答案。不,没有更好的方法。当剪贴板内容发生更改时(特别是当它来自Java应用程序外部时),不会发送任何事件,因此只有轮询方法是合适的 import javafx.application.Application; import javafx.scene.Scene; import javafx.s

如回答此问题时所述,可以设置时间线来检查系统剪贴板中是否有更改:

但是有更好的办法吗?例如,事件侦听器?我搜索了JavaFX8文档,没有发现任何明显有用的东西


首选使用JavaFx的解决方案,但欢迎所有答案。

不,没有更好的方法。当剪贴板内容发生更改时(特别是当它来自Java应用程序外部时),不会发送任何事件,因此只有轮询方法是合适的

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.Clipboard;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        final Clipboard systemClipboard = Clipboard.getSystemClipboard();

        new com.sun.glass.ui.ClipboardAssistance(com.sun.glass.ui.Clipboard.SYSTEM) {
            @Override
            public void contentChanged() {
                System.out.print("System clipboard content changed: ");
                if ( systemClipboard.hasImage() ) {
                    System.out.println("image");
                } else if ( systemClipboard.hasString() ) {
                    System.out.println("string");
                } else if ( systemClipboard.hasFiles() ) {
                    System.out.println("files");
                }
            }
        };

        primaryStage.setScene(new Scene(new StackPane()));
        primaryStage.show();
    }

}
测试:

  • 按键打印屏幕
  • 选定字符串的Ctrl+C组合键
  • 选定文件的Ctrl+c组合键

访问内部api有多大胆:)+1这在macOS 10.12.6和Java 8更新171上对我不起作用。