Я новичок в Kotlin и TorandoFX. Может быть, мне не хватает чего-то очень простого в TornadoFX. Я хочу создать из списка (который должен быть изменяемым) кнопки в представлении. Если пользователь нажимает кнопку добавления, список должен получить новый элемент, и это должно привести к появлению новой кнопки в представлении. Спасибо за помощь.
Я думал, что это должно выглядеть так:
import tornadofx.*
fun main(args: Array<String>) {
launch<MyApp>(args)
}
class MyApp: App(MainView::class)
class MainView: View("MainView") {
val values = ArrayList<Int>(listOf(1,2,3)).asObservable()
var count = 4
override val root = vbox {
values.forEach { x ->
button(x.toString())
}
button("add") {
action {
values.add(count)
println(values.toString())
count++
}
}
}
}
этот код приводит к этому представлению, но если я нажму кнопку, представление не обновится. Этот код приводит к этому представлению, но если я нажму кнопку, представление не обновится. Я думаю, что я что-то упустил в привязке.
Я думал, что из-за того, что я перебираю список в представлении, он сам обновится.
Но насколько я вижу, вы не перебираете значения в обработчике событий кнопки (я тоже не знаю TornadoFX/kotlin). Обработчику события нужно создать дополнительную кнопку и добавить ее в vbox.
Ваш код, который создает кнопки, выполняется только один раз при выполнении конструктора, но, как уже указал @James_D, он не выполняется в вашем обработчике событий.
Мы выяснили, я был прав с обязательной частью. Мне просто нужно было использовать функцию bindChildren()
и дать функции observableArray и функцию для преобразования элементов массива в качестве параметра.
Спасибо вам за помощь.
import javafx.collections.FXCollections
import tornadofx.*
fun main(args: Array<String>) {
launch<MyApp>(args)
}
class MyApp: App(MainView::class)
class MainView: View("MainView") {
val values = FXCollections.observableArrayList<Int>(listOf(1,2,3))
var count = 4
override val root = vbox {
vbox {
bindChildren(values) { x ->
button(x.toString())
}
}
vbox() {
button("add") {
action {
values.add(count)
count++
}
}
}
}
}
Почему вы используете TornadoFX? Вам НЕ ДОЛЖЕН использовать его для использования JavaFX с Kotlin.
Я не знаю TornadoFX, но почему вы считаете, что дополнительная кнопка создается только потому, что вы добавили значение в свой наблюдаемый список?