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)
}
}
)
}