我有一个简单的tornadoFX程序,可以在屏幕上的随机位置生成一些圆圈。但是,没有一个圆圈被绘制。我添加了一些调试代码,用于在绘制圆形时打印一条线,并且只打印一次。
我希望圈子以100毫秒的间隔出现,以及点击“添加演员”按钮时。
B
奇怪的是,如果我在圆圈绘制代码中设置断点,则会绘制圆圈并打印调试行。
答案 0 :(得分:3)
一些观察结果:
调用someList.observable()
将创建一个由基础列表支持的可观察列表,但基础列表上的突变不会发出事件。您应该立即将actors
初始化为可观察列表。
访问可观察列表必须在UI线程上进行,因此您需要在runLater
中包含变异调用。
对于试图运行您的示例的人 - 您没有包含样式表,但在App
子类中引用了一个样式表,因此IDEA很可能会导入TornadoFX Stylesheet
类。这不会很好地结束:)
also
电话无效,因此我将其删除。
我在这里和那里更新了您的代码,例如关于如何创建根节点的问题:)
将这些点考虑在内的更新示例如下所示:
private const val WINDOW_HEIGHT = 600.0
private const val WINDOW_WIDTH = 1024.0
class MainApp : App(WorldView::class)
data class Actor(val x: Double, val y: Double)
class WorldView : View("Actor Simulator") {
private val actors = FXCollections.observableArrayList<Actor>()
override fun onDock() {
runAsync {
(0..100).forEach {
val x = ThreadLocalRandom.current().nextDouble(0.0, WINDOW_WIDTH.toDouble())
val y = ThreadLocalRandom.current().nextDouble(0.0, WINDOW_HEIGHT.toDouble())
runLater {
actors.add(Actor(x, y))
}
Thread.sleep(100)
}
}
}
override val root = stackpane {
setPrefSize(WINDOW_WIDTH, WINDOW_HEIGHT)
group {
bindChildren(actors) {
circle {
centerX = it.x
centerY = it.y
radius = 10.0
println("drew circle")
}
}
}
button("Add actor") {
action {
actors.add(Actor(0.0, 0.0))
}
}
}
}