我正在使用绑定和属性在JavaFX中工作。 我有一个Label label
和一个Person currentPerson
。 我有以下代码:JavaFX绑定和属性更改
label.textProperty().bind(currentPerson.nameProperty());
然后,我必须在另一段代码:
currentPerson = newPerson; //newPerson is a given Person instance
这样的label
的textProperty
不更新!
但是,如果我的代码段做:
currentPerson.setName(newPerson.getName());
那么这个更新的label
的textProperty
。
我的问题是:为什么第二种方式更新的label
的textProperty
,而先不,即使的currentPerson
nameProperty
在两种情况下发生改变?
'label.textProperty()。bind(currentPerson.nameProperty());'只计算一次。那时,计算表达式'currentPerson.nameProperty()'并修改'currentPerson'变量不会导致上面的代码行再次被执行。 'currentPerson.setName(newPerson.getName());'修改currentPerson的'name'属性,因此对绑定到它的'text'属性有影响。您可能应该使用'label.textProperty()。bind(newPerson.nameProperty())'来代替。如果这可以帮助您避免代码重复,则可以将此代码移至新方法。 – fabian
@fabian好吧,但是如果我打印'currentPerson'的'nameProperty',在赋值之后并且也在赋值体外,它将被更改为'newPerson'中包含的'nameProperty'。我明白你说的是什么,但'nameProperty'已经改变,评估不再执行(为什么?)。无论如何,感谢您的快速回复,也许我会按照您的建议绑定到'newPerson'而不是'currentPerson'。 – Kenna
@Kenna *“如果在赋值后打印'currentPerson'的'nameProperty' ...它已经改变了。”*我怀疑它;我怀疑你正从'currentPerson'的* new *值中获得'nameProperty'。如果你做'StringProperty name = currentPerson.nameProperty();'并打印'name';然后执行'currentPerson = newPerson;'并再次打印'name',它不会改变。 –