JavaFX教程 – JavaFX属性
JavaFX属性存储控件的内部状态,并允许我们监听来自JavaFX UI控件的状态更改。
JavaFX属性可以彼此绑定。绑定行为允许属性根据来自另一个属性的更改值来同步其值。
JavaFX属性的类型
有两种类型的JavaFX属性:
- 读/写
- 只读
JavaFX的属性包含实际值,并提供更改支持,无效支持和绑定功能。
所有JavaFX属性类都位于 javafx.beans.property.*
包命名空间中。
下面的列表是常用的属性类。
- javafx.beans.property.SimpleBooleanProperty
- javafx.beans.property.ReadOnlyBooleanWrapper
- javafx.beans.property.SimpleintegerProperty
- javafx.beans.property.ReadOnlyintegerWrapper
- javafx.beans.property.SimpleDoubleProperty
- javafx.beans.property.ReadOnlyDoubleWrapper
- javafx.beans.property.SimpleStringProperty
- javafx.beans.property.ReadOnlyStringWrapper
Simple
的属性是读/写属性类。具有 ReadOnly
的属性是只读属性。
读/写属性
读/写属性是可以读取和修改的属性值。
例如, SimpleStringProperty
类创建一个字符串属性,该属性对包装的字符串值是可读写的。
以下代码演示了一个 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("w3cschool.cn"); password.set("example.com"); System.out.println("Modified StringProperty " + password.get() ); } }
上面的代码生成以下结果。
上面的代码声明了类型 StringProperty
的变量 password
,并分配给SimpleStringProperty
类的一个实例。
实际的值是字符串“w3cschool.cn”,它被传递到 SimpleStringProperty
类的构造函数中。
要读取值,请调用 get()
方法或 getValue()
方法,该方法返回实际的包装值。
要修改该值,请调用 set()
方法或 setValue()
并传入一个字符串。
只读属性
要创建只读属性,请使用以 ReadOnly
作为前缀的包装类。
创建只读属性需要两个步骤。
- 实例化只读包装类
- 调用方法getReadOnlyProperty()返回一个真正的只读属性对象
ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("www.w3cschool.cn"); ReadOnlyStringProperty readOnlyUserName = userName.getReadOnlyProperty();
JavaFX JavaBean
以下代码显示了如何创建JavaFX JavaBean。当构建基于Swing的应用程序时,我们使用getter和setter创建JavaBean。
然后我们必须通过Swing模型类在UI逻辑中获取和设置数据。通过使用JavaFX属性创建JavaFX JavaBean,JavaFX将执行数据绑定,并完成域模型类和UI控件之间的数据交换作业。
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; } }
属性更改事件
属性可以通知值更改事件处理程序,以在属性更改时进行响应。
JavaFX属性对象包含一个addListener()方法,它接受两种类型的功能接口:ChangeListener和invalidationListener。
所有JavaFX属性都是ObservableValue和Observable接口的后代,它们分别为ChangeListener和invalidationListener提供了addListener()方法。
以下代码显示如何创建要注册到属性的ChangeListener。随着属性的值改变,将调用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); }); } }
以下代码显示如何创建一个invalidationListener以向属性注册。随着属性的值更改,将调用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之间的区别。
- 使用ChangeListener,我们将获得Observable(ObservableValue),旧值和新值。
- 使用invalidationListener只获取Observable对象(属性)。