JavaFX屬性存儲(chǔ)控件的內(nèi)部狀態(tài),并允許我們監(jiān)聽(tīng)來(lái)自JavaFX UI控件的狀態(tài)更改。
JavaFX屬性可以彼此綁定。綁定行為允許屬性根據(jù)來(lái)自另一個(gè)屬性的更改值來(lái)同步其值。
有兩種類(lèi)型的JavaFX屬性:
JavaFX的屬性包含實(shí)際值,并提供更改支持,無(wú)效支持和綁定功能。
所有JavaFX屬性類(lèi)都位于 javafx.beans.property.*
包命名空間中。
下面的列表是常用的屬性類(lèi)。
Simple
的屬性是讀/寫(xiě)屬性類(lèi)。具有 ReadOnly
的屬性是只讀屬性。
讀/寫(xiě)屬性是可以讀取和修改的屬性值。
例如, SimpleStringProperty
類(lèi)創(chuàng)建一個(gè)字符串屬性,該屬性對(duì)包裝的字符串值是可讀寫(xiě)的。
以下代碼演示了一個(gè) SimpleStringProperty
類(lèi)的實(shí)例,并通過(guò)set()方法修改該屬性。
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class Main{ public static void main(String[] args) { StringProperty password = new SimpleStringProperty("w3cschool.cn"); password.set("example.com"); System.out.println("Modified StringProperty " + password.get() ); } }
上面的代碼生成以下結(jié)果。
上面的代碼聲明了類(lèi)型 StringProperty
的變量 password
,并分配給SimpleStringProperty
類(lèi)的一個(gè)實(shí)例。
實(shí)際的值是字符串“w3cschool.cn",它被傳遞到 SimpleStringProperty
類(lèi)的構(gòu)造函數(shù)中。
要讀取值,請(qǐng)調(diào)用 get()
方法或 getValue()
方法,該方法返回實(shí)際的包裝值。
要修改該值,請(qǐng)調(diào)用 set()
方法或 setValue()
并傳入一個(gè)字符串。
要?jiǎng)?chuàng)建只讀屬性,請(qǐng)使用以 ReadOnly
作為前綴的包裝類(lèi)。
創(chuàng)建只讀屬性需要兩個(gè)步驟。
ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("o2fo.com"); ReadOnlyStringProperty readOnlyUserName = userName.getReadOnlyProperty();
以下代碼顯示了如何創(chuàng)建JavaFX JavaBean。當(dāng)構(gòu)建基于Swing的應(yīng)用程序時(shí),我們使用getter和setter創(chuàng)建JavaBean。
然后我們必須通過(guò)Swing模型類(lèi)在UI邏輯中獲取和設(shè)置數(shù)據(jù)。通過(guò)使用JavaFX屬性創(chuàng)建JavaFX JavaBean,JavaFX將執(zhí)行數(shù)據(jù)綁定,并完成域模型類(lèi)和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; } }
屬性可以通知值更改事件處理程序,以在屬性更改時(shí)進(jìn)行響應(yīng)。
JavaFX屬性對(duì)象包含一個(gè)addListener()方法,它接受兩種類(lèi)型的功能接口:ChangeListener和invalidationListener。
所有JavaFX屬性都是ObservableValue和Observable接口的后代,它們分別為ChangeListener和invalidationListener提供了addListener()方法。
以下代碼顯示如何創(chuàng)建要注冊(cè)到屬性的ChangeListener。隨著屬性的值改變,將調(diào)用change()方法。
import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; public class Main { 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)建一個(gè)invalidationListener以向?qū)傩宰?cè)。隨著屬性的值更改,將調(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ū)別。
更多建議: