🐻‍❄️

[Compose for Desktop]クリップボードに画像をコピーして、特定の場所にペーストする

2023/04/15に公開

はじめに

Compose for Desktopを利用してアプリを開発しているとクリップボードに画像をコピーできるようにしたくなる。Compose for Desktopを使っている環境でクリップボードに画像をコピーするための方法を探したので以下にまとめておきます。

実装方法

以下のようにJavaのAWTの仕組みを利用して、ファイルをクリップボードにコピーできるようにしておく。

object ClipBoardUtils {
    private val clipboard get() = Toolkit.getDefaultToolkit().systemClipboard

    fun copyFile(file: File): Boolean {
        return try {
            val fileSelection = FileSelection(file)
            clipboard.setContents(fileSelection, fileSelection)
            true
        } catch (e: IllegalStateException) {
            false
        }
    }

    private class FileSelection(private val file: File) : Transferable, ClipboardOwner {
        override fun getTransferDataFlavors(): Array<DataFlavor> {
            return arrayOf(DataFlavor.javaFileListFlavor)
        }

        override fun isDataFlavorSupported(flavor: DataFlavor): Boolean {
            return DataFlavor.javaFileListFlavor.equals(flavor)
        }

        @Throws(UnsupportedFlavorException::class, IOException::class)
        override fun getTransferData(flavor: DataFlavor): Any {
            return listOf(file)
        }

        override fun lostOwnership(clipboard: Clipboard?, contents: Transferable?) {}
    }
}

動作確認

この処理を利用することで以下のように特定のファイルをクリップボードにコピーして、GitHubなどにペーストするような処理を実装できるようになる。

Discussion