Compose For Desktopでファイルを開く・保存ダイアログを表示する

Compose For Desktopでファイルを開く・保存ダイアログを表示する。

環境

  • Compose for Desktop 1.0.0-alpha3

ファイルを開くダイアログを表示する

ファイルを開くダイアログを表示するプログラム。

「ダイアログを表示する」ボタンを押すとファイルを開くダイアログを表示する。

fun main() = application {
    var isOpenFileDialog by remember { mutableStateOf(false) }
    Window(onCloseRequest = ::exitApplication) {
        Button(onClick = { isOpenFileDialog = true }) { Text("ダイアログを表示する") }

        if (isOpenFileDialog) {
            FileDialog(
                onCloseRequest = { directory, file ->
                    isOpenFileDialog = false
                    if (directory != null && file != null) {
                        println(File(directory, file).absolutePath)
                    }
                }
            )
        }
    }
}

@Composable
private fun FileDialog(
    parent: Frame? = null,
    title: String = "Choose a file",
    onCloseRequest: (directory: String?, result: String?) -> Unit
) = AwtWindow(
    create = {
        object : FileDialog(parent, title, LOAD) {
            override fun setVisible(value: Boolean) {
                super.setVisible(value)
                if (value) {
                    onCloseRequest(directory, file)
                }
            }
        }
    },
    dispose = FileDialog::dispose
)

ファイルを保存ダイアログを表示する

ファイルを保存ダイアログを表示できるようにする。

引数のmodeにFileDialog.SAVEを指定すると、保存ダイアログを表示する。

@Composable
private fun FileDialog(
    parent: Frame? = null,
    title: String = "Choose a file",
    mode: Int = FileDialog.LOAD,
    onCloseRequest: (directory: String?, result: String?) -> Unit
) = AwtWindow(
    create = {
        object : FileDialog(parent, title, mode) {
            override fun setVisible(value: Boolean) {
                super.setVisible(value)
                if (value) {
                    onCloseRequest(directory, file)
                }
            }
        }
    },
    dispose = FileDialog::dispose

保存ダイアログを表示する。

if (isOpenFileDialog) {
    FileDialog(
        mode = FileDialog.SAVE,
        onCloseRequest = { directory, file ->
            isOpenFileDialog = false
            if (directory != null && file != null) {
                println(File(directory, file).absolutePath)
            }
        }
    )
}

ダイアログに表示されるファイルをフィルタリングする。

ダイアログに表示されるファイルをフィルタリングできるようにする。

@Composable
private fun FileDialog(
    parent: Frame? = null,
    title: String = "Choose a file",
    mode: Int = FileDialog.LOAD,
    filenameFilter: FilenameFilter? = null,
    onCloseRequest: (directory: String?, result: String?) -> Unit
) = AwtWindow(
    create = {
        object : FileDialog(parent, title, mode) {
            init {
                filenameFilter?.let { setFilenameFilter(filenameFilter) }
            }

            override fun setVisible(value: Boolean) {
                super.setVisible(value)
                if (value) {
                    onCloseRequest(directory, file)
                }
            }
        }
    },
    dispose = FileDialog::dispose
)

拡張子が”*.txt”と”*.md”のファイルのみ表示する。

if (isOpenFileDialog) {
    FileDialog(
        mode = FileDialog.LOAD,
        filenameFilter = { dir, name -> name?.matches(Regex("(.+.txt)|(.*.md)")) ?: false },
        onCloseRequest = { directory, file ->
            isOpenFileDialog = false
            if (directory != null && file != null) {
                println(File(directory, file).absolutePath)
            }
        }
    )
}

ディレクトリとファイル名の初期値を設定する

ディレクトリとファイル名の初期値を設定できるようにする。

@Composable
private fun FileDialog(
    parent: Frame? = null,
    title: String = "Choose a file",
    mode: Int = FileDialog.LOAD,
    filenameFilter: FilenameFilter? = null,
    directory: String? = null,
    file: String? = null,
    onCloseRequest: (directory: String?, result: String?) -> Unit
) = AwtWindow(
    create = {
        object : FileDialog(parent, title, mode) {
            init {
                filenameFilter?.let { setFilenameFilter(filenameFilter) }
                directory?.let { setDirectory(directory) }
                file?.let { setFile(file) }
            }

            override fun setVisible(value: Boolean) {
                super.setVisible(value)
                if (value) {
                    onCloseRequest(directory, file)
                }
            }
        }
    },
    dispose = FileDialog::dispose
)

ホームディレクトリの”default.md”を初期値にしてダイアログを表示する。

if (isOpenFileDialog) {
    FileDialog(
        mode = FileDialog.SAVE,
        filenameFilter = { dir, name -> name?.matches(Regex("(.+.txt)|(.*.md)")) ?: false },
        directory = System.getProperty("user.home"),
        file = "default.md",
        onCloseRequest = { directory, file ->
            isOpenFileDialog = false
            if (directory != null && file != null) {
                println(File(directory, file).absolutePath)
            }
        }
    )
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください