Для этого не нужно создавать подкласс Button.Просто создайте функцию расширения на ButtonBase
, которая настраивает кнопку так, как вы хотите, и вызывайте эту функцию один раз для каждой кнопки.Вам также следует рассмотреть возможность использования FXML для использования конструкторов безопасных типов, что сделало бы это еще более удобным, не говоря уже о безопасных типах.
Вот пример такой функции, которая позволяет указывать парсер, фильтрыи загрузите файл в целевое строковое свойство.Существует также парсер по умолчанию, который просто загружает файл как есть.
fun ButtonBase.loadFile(target: Property<String>,
parser: (File) -> String = { Files.readAllBytes(it.toPath()).toString(StandardCharsets.UTF_8) },
filters: Array<FileChooser.ExtensionFilter>) {
action {
chooseFile(text, filters, FileChooserMode.Single).firstOrNull()?.let {
target.value = parser.invoke(it)
}
}
}
Вот полный пример безопасного конструктора типов с использованием функции:
class FileChooserTest : View() {
val fileContent = SimpleStringProperty()
override val root = borderpane {
center {
textarea(fileContent)
}
bottom {
buttonbar {
button("Select a USFM File") {
loadFile(fileContent, filters = arrayOf(FileChooser.ExtensionFilter("USFM File", "*.usfm")))
}
}
}
}
}
Если вы действительно хотите придерживатьсяв FXML (может быть, вам просто нравится набирать вещи :), вы бы назвали это так:
class AppView : View("USFM Viewer") {
override val root: BorderPane by fxml()
val chooseFile: Button by fxid<Button>()
val textArea: TextArea by fxid<TextArea>()
init {
chooseFile.loadFile(textArea.textProperty(), filters = arrayOf(FileChooser.ExtensionFilter("USFM File", "*.usfm")))
}
}
Функция loadFile
может быть расширена любым удобным вам способом, например, путем возврата выбранного файла,назначение отдельного заголовка диалоговому окну выбора файлов и т. д.
Еще один совет: в своем примере кода вы нашли кнопку с помощью делегата by fxml()
, но затем вы сделали еще один lookup
, чтобы снова найти кнопку.Вы должны повторно использовать кнопку, которую вы уже нашли.