2017-12-27 349 views
0

我正在使用绑定和属性在JavaFX中工作。 我有一个Label label和一个Person currentPerson。 我有以下代码:JavaFX绑定和属性更改

label.textProperty().bind(currentPerson.nameProperty()); 

然后,我必须在另一段代码:

currentPerson = newPerson; //newPerson is a given Person instance 

这样的labeltextProperty不更新!

但是,如果我的代码段做:

currentPerson.setName(newPerson.getName()); 

那么这个更新的labeltextProperty

我的问题是:为什么第二种方式更新的labeltextProperty,而先不,即使的currentPersonnameProperty在两种情况下发生改变?

+0

'label.textProperty()。bind(currentPerson.nameProperty());'只计算一次。那时,计算表达式'currentPerson.nameProperty()'并修改'currentPerson'变量不会导致上面的代码行再次被执行。 'currentPerson.setName(newPerson.getName());'修改currentPerson的'name'属性,因此对绑定到它的'text'属性有影响。您可能应该使用'label.textProperty()。bind(newPerson.nameProperty())'来代替。如果这可以帮助您避免代码重复,则可以将此代码移至新方法。 – fabian

+0

@fabian好吧,但是如果我打印'currentPerson'的'nameProperty',在赋值之后并且也在赋值体外,它将被更改为'newPerson'中包含的'nameProperty'。我明白你说的是什么,但'nameProperty'已经改变,评估不再执行(为什么?)。无论如何,感谢您的快速回复,也许我会按照您的建议绑定到'newPerson'而不是'currentPerson'。 – Kenna

+0

@Kenna *“如果在赋值后打印'currentPerson'的'nameProperty' ...它已经改变了。”*我怀疑它;我怀疑你正从'currentPerson'的* new *值中获得'nameProperty'。如果你做'StringProperty name = currentPerson.nameProperty();'并打印'name';然后执行'currentPerson = newPerson;'并再次打印'name',它不会改变。 –

回答

0

As mentioned,你失去了你的第一结合后:

currentPerson = newPerson; 

解决方法是,(重新)绑定currentPerson任何转让后,currentPerson,或相反,使用一种方法来传递newPerson数据,如:

currentPerson.setPerson(newPerson); 


public class Person{ 

    private StringProperty name = new SimpleStringProperty(); 

    // .... 


    public void setPerson(Person person) { 
     // .... 
     this.name.set(person.name.get()); 
    } 
} 
+0

理解,赋值'currentPerson'指向另一个对象之后,而不是被绑定的对象。这正是我现在正在做的,一种更新参数属性的方法! :)谢谢tou – Kenna

-1

必须发生的,你已经在关系bind设置为person's name,所以当你使用getName,它更新label

1

我觉得最基本的回答你的问题是,该行currentPerson = newPerson;后,currentPerson对象与之前绑定到label的对象不是同一个对象。

+0

嗯,是的,我认为这就是关键。看到上面的评论,他们基本上是说同样的事情。所以基本原因是Java传递值,而不是通过引用。 – Kenna

+0

是的! Java按值传递(**对象的引用**)。 –