2017-12-27 346 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按值傳遞(**對象的引用**)。 –