JavaFX屬性存儲控件的內(nèi)部狀態(tài),并允許我們監(jiān)聽來自JavaFX UI控件的狀態(tài)更改。JavaFX屬性可以彼此綁定。綁定行為允許屬性根據(jù)來自另一個屬性的更改值來同步其值。
有兩種類型的JavaFX屬性:
JavaFX的屬性包含實際值,并提供更改支持,無效支持和綁定功能。所有JavaFX屬性類都位于javafx.beans.property.*
包命名空間中。
下面的列表是常用的屬性類。
Simple
的屬性是讀/寫屬性類。擁有ReadOnly
的屬性是只讀屬性。
讀/寫屬性是可以讀取和修改的屬性值。例如,SimpleStringProperty
類創(chuàng)建一個字符串屬性,該屬性對包裝的字符串值是可讀寫的。
以下代碼演示了SimpleStringProperty
類的一個實例,并通過set()
方法修改該屬性。
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Main{
public static void main(String[] args) {
StringProperty password = new SimpleStringProperty("yiibai.com");
password.set("example.com");
System.out.println("Modified StringProperty " + password.get() );
}
}
上面的代碼生成以下結(jié)果。
Modified StringProperty example.com
上面的代碼聲明了類型為StringProperty
的變量password
,并分配給SimpleStringProperty
類的實例。實際的值是字符串“yiibai.com”,它被傳遞到SimpleStringProperty
類的構(gòu)造函數(shù)中。
要讀取值,請調(diào)用get()
方法或getValue()
方法,該方法返回實際的包裝值。如果要修改這個值,請調(diào)用set()
方法或setValue()
并傳入一個字符串值。
要創(chuàng)建只讀屬性,請使用以ReadOnly
作為前綴的包裝類。創(chuàng)建只讀屬性需要兩個步驟。
getReadOnlyProperty()
返回一個真正的只讀屬性對象ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("yiibai.com");
ReadOnlyStringProperty readOnlyUserName = userName.getReadOnlyProperty();
以下代碼顯示了如何創(chuàng)建JavaFX JavaBean。當(dāng)構(gòu)建基于Swing的應(yīng)用程序時,我們使用getter
和setter
創(chuàng)建JavaBean
。
然后我們必須通過Swing模型類在UI邏輯中獲取和設(shè)置數(shù)據(jù)。通過使用JavaFX屬性創(chuàng)建JavaFX JavaBean,JavaFX將執(zhí)行數(shù)據(jù)綁定,并完成域模型類和UI控件之間的數(shù)據(jù)交換作業(yè)。參考以下代碼 -
import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
class User {
private final static String USERNAME_PROP_NAME = "userName";
private final ReadOnlyStringWrapper userName;
private final static String PASSWORD_PROP_NAME = "password";
private StringProperty password;
public User() {
userName = new ReadOnlyStringWrapper(this, USERNAME_PROP_NAME,"fake user");
password = new SimpleStringProperty(this, PASSWORD_PROP_NAME, "");
}
public final String getUserName() {
return userName.get();
}
public ReadOnlyStringProperty userNameProperty() {
return userName.getReadOnlyProperty();
}
public final String getPassword() {
return password.get();
}
public final void setPassword(String password) {
this.password.set(password);
}
public StringProperty passwordProperty() {
return password;
}
}
屬性可以通知值更改的事件處理程序,以便在屬性更改時進行響應(yīng)處理相關(guān)操作。JavaFX屬性對象包含一個addListener()
方法,它接受兩種類型的功能接口:ChangeListener
和invalidationListener
。
所有JavaFX屬性都是實現(xiàn)了ObservableValue
和Observable
接口,它們分別為ChangeListener
和invalidationListener
提供了addListener()
方法。
以下代碼顯示如何創(chuàng)建ChangeListener
來注冊到屬性。當(dāng)屬性的值發(fā)生改變時,將調(diào)用change()
方法。
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
public class Main {// copyright w w w .Yi I b A I .COm
public static void main(String[] args) {
SimpleIntegerProperty xProperty = new SimpleIntegerProperty(0);
// Adding a change listener with anonymous inner class
xProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number oldVal,
Number newVal) {
System.out.println("old value:"+oldVal);
System.out.println("new value:"+newVal);
}
});
// Adding a change listener with lambda expression
xProperty.addListener((ObservableValue<? extends Number> ov, Number oldVal,
Number newVal) -> {
System.out.println("old value:"+oldVal);
System.out.println("new value:"+newVal);
});
}
}
以下代碼顯示了如何創(chuàng)建一個invalidationListener
以向?qū)傩宰?。隨著屬性的值改變,將調(diào)用invalidated()
方法。
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.SimpleIntegerProperty;
public class Main {
public static void main(String[] args) {
SimpleIntegerProperty xProperty = new SimpleIntegerProperty(0);
// Adding a invalidation listener (anonymous inner class)
xProperty.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable o) {
System.out.println(o.toString());
}
});
// Adding a invalidation listener (lambda expression)
xProperty.addListener((Observable o) -> {
System.out.println(o.toString());
});
}
}
ChangeListener
和invalidationListener
之間的區(qū)別。
ChangeListener
將可獲取Observable(ObservableValue)
的舊值和新值。invalidationListener
只獲取Observable
對象(屬性)