在Kotlin中使用JavaFX我遇到了一个奇怪的问题,我在下面贴了一个最小的例子.问题是,如果不包括Button,那么侦听器不会打印出任何内容. 按钮的操作只需要以某种方式访问对象h,然后触发侦听器.按钮不需要点击,也就是说,动作代码不需要执行.它必须在那里.
import javafx.application.Application
import javafx.beans.property.SimpleObjectProperty
import javafx.event.ActionEvent
import javafx.event.EventHandler
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.control.ComboBox
import javafx.scene.layout.Region
import javafx.scene.layout.VBox
import javafx.stage.Stage
fun main() {
Application.launch(ExpRunner::class.java)
}
class ExpRunner : Application() {
override fun start(primaryStage: Stage) {
val myScene = Scene(buildView(), 400.0, 400.0)
primaryStage.apply { title = "Strange" }
.apply { scene = myScene }
primaryStage.show()
}
fun buildView(): Region {
val h = Holder()
val cb = ComboBox<String>().apply { valueProperty().bindBidirectional(h.prop) }
.apply { listOf("a", "b").forEach { items.add(it) } }
h.prop.apply {
addListener { _, _, v -> println("Prop value changed: $v") }
return VBox(
10.0,
// If this button is not included, the listener above doesn't get triggered??
Button("Check").apply { onAction = EventHandler<ActionEvent> { _ -> println(h.hashCode()) } },
cb,
)
}
}
}
class Holder {
val prop = SimpleObjectProperty<String>("a")
}
要使用下面的代码进行复制,只需运行,然后更改组合框 Select .它将打印出一行,说明props 已更改.但是,如果您注释掉将按钮添加到VBox中的行,则在更改组合框 Select 时,不会打印出任何内容.
如有任何解释,我将不胜感激.
谢谢.