JavaFx 监听剪切板实现(Kotlin)

原文地址: JavaFx 监听剪切板实现(Kotlin) | Stars-One的杂货小窝

软件有个需求,想要实现监听剪切板的内容,若内容符合预期,则进行相关的操作,就可以免去用户手动粘贴的操作,提供软件的用户体验感

比如说之前我的一款下载小说的软件,复制小说的地址后,实现自动解析功能

本篇代码以Kotlin为主,Java实现也是类似,各位可以参考下

实现

本质上是利用一个剪切板的setContents方法,可以传递个监听接口ClipboardOwner

定义个类实现此接口ClipboardOwner,实现此接口定义个的方法lostOwnership

class SystemClipboardMonitor : ClipboardOwner {
    private val clipboard = Toolkit.getDefaultToolkit().systemClipboard
    //定义个变量,用来控制监听的开关
    private var isOpenListener = true

    //定义个接口回调,方便在使用的时候回调
    var listener: GlobalClipBoardListener? = null

    init {
        clipboard.setContents(clipboard.getContents(null), this)
    }

    override fun lostOwnership(clipboard: Clipboard?, contents: Transferable?) {
        
        try {
            Thread.sleep(1)
            var text = ""
            if (clipboard?.isDataFlavorAvailable(DataFlavor.stringFlavor) == true) {
                text = clipboard.getData(DataFlavor.stringFlavor).toString()
            }
            clipboard?.setContents(clipboard.getContents(null), this)
            if (isOpenListener) {
                listener?.onCopy(text, clipboard, contents)
            }
        } catch (e: IllegalStateException) {
            //有时候会出现剪切板被占用就会出现此异常
        }
    }

    /**
     * 移除监听
     *
     */
    fun stopListen() {
        isOpenListener = false
    }

    /**
     * 开启监听
     *
     */
    fun startListen() {
        isOpenListener = true
    }

    fun addClipboardListener(listener: GlobalClipBoardListener) {
        this.listener = listener
    }
}

interface GlobalClipBoardListener {
    fun onCopy(text: String?, clipboard: Clipboard?, contents: Transferable?)
}

使用

使用的话,新建一个SystemClipboardMonitor对象即可,之后设置你的监听操作,如下面所示

val monitor = SystemClipboardMonitor()
monitor.addClipboardListener(object :GlobalClipBoardListener{
    override fun onCopy(text: String?, clipboard: Clipboard?, contents: Transferable?) {
        //这里可以加上相关的判断来测试内容是否是符合自己的定义的条件才触发对应的操作
        println("已监听到方法...")
        println(text)
    }
})

考虑到会有设置的选项,就定义了两个开关方法,可以在需要的时候进行开关的设置(默认是剪切板的监听就是开启的)

//开启监听
monitor.stopListen()

//停止监听
monitor.startListen()

参考

posted @ 2021-10-10 16:37  Stars-one  阅读(584)  评论(0编辑  收藏  举报