gpt4 book ai didi

javafx - 如何使此 JavaFX 绑定(bind)多次触发?

转载 作者:行者123 更新时间:2023-12-02 12:57:29 25 4
gpt4 key购买 nike

为什么第二次更新绑定(bind)的源数据时,该绑定(bind)不触发其关联代码?

在我看来,任何 TestObj 的“名称”字段的每次更改都应该导致 testProperty1 显示第三个元素的名称。在这种情况下,它显示绑定(bind)后的名称,在第一次更新后,但在第二次更新后,它仍然显示第一次更新的名称。每次更改 TestObj 时,如何让它更新 testProperty1?

class TestObj {
var name by property<String>()
fun nameProperty() = getProperty(TestObj::name)
}

class TestBase {
var testObjs by property<List<TestObj>>()
fun testObjsProperty() = getProperty(TestBase::testObjs)
}

class TestBaseModel: ItemViewModel<TestBase>(TestBase()) {
val objects: ListProperty<TestObj> =
bind(autocommit = true) { item?.testObjsProperty() } as ListProperty<TestObj>

fun observableObjs(): StringBinding {
val observableObjs = FXCollections.observableList(objects) { o: TestObj ->
arrayOf<Observable>(
o.nameProperty()
)
}
return stringBinding(observableObjs, objects) {
(observableObjs.map {
it.name
}).joinToString()
}
}
}

val testProperty1 = SimpleStringProperty()
testProperty1.value = "unset"

val base = TestBaseModel()
for (i in 0..4) {
base.objects.add(TestObj().apply{
name = "$i"
})
}

assertEquals("unset", testProperty1.value)

testProperty1.bind(stringBinding(base.observableObjs()) {
base.objects[2].name
})

assertEquals("2", testProperty1.value)

base.objects[2].name = "a"

assertEquals("a", testProperty1.value)

base.objects[2].name = "ab"

// This assertion fails, claims value is still "a"
assertEquals("ab", testProperty1.value)

最佳答案

它看起来像一个竞争条件。绑定(bind)异步工作,它可能没有机会在您断言值之前触发监听器。

特别是如果测试代码正在 JavaFX 应用程序线程上运行。

关于javafx - 如何使此 JavaFX 绑定(bind)多次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com