为什么我的tornadoFX ObservableList没有收到更新?

时间:2018-05-20 17:57:31

标签: kotlin tornadofx

我有一个简单的tornadoFX程序,可以在屏幕上的随机位置生成一些圆圈。但是,没有一个圆圈被绘制。我添加了一些调试代码,用于在绘制圆形时打印一条线,并且只打印一次。

我希望圈子以100毫秒的间隔出现,以及点击“添加演员”按钮时。

B

奇怪的是,如果我在圆圈绘制代码中设置断点,则会绘制圆圈并打印调试行。

1 个答案:

答案 0 :(得分:3)

一些观察结果:

  1. 调用someList.observable()将创建一个由基础列表支持的可观察列表,但基础列表上的突变不会发出事件。您应该立即将actors初始化为可观察列表。

  2. 访问可观察列表必须在UI线程上进行,因此您需要在runLater中包含变异调用。

  3. 对于试图运行您的示例的人 - 您没有包含样式表,但在App子类中引用了一个样式表,因此IDEA很可能会导入TornadoFX Stylesheet类。这不会很好地结束:)

  4. also电话无效,因此我将其删除。

  5. 我在这里和那里更新了您的代码,例如关于如何创建根节点的问题:)

  6. 将这些点考虑在内的更新示例如下所示:

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