JavaFX属性存储控件的内部状态,并允许我们监听来自JavaFX UI控件的状态更改。JavaFX属性可以彼此绑定。绑定行为允许属性根据来自另一个属性的更改值来同步其值。

JavaFX属性的类型

有两种类型的JavaFX属性:

  • 读写(Read/Writable)
  • 只读(Read-Only)

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()方法修改该属性。

  1. import javafx.beans.property.SimpleStringProperty;
  2. import javafx.beans.property.StringProperty;
  3. public class Main{
  4. public static void main(String[] args) {
  5. StringProperty password = new SimpleStringProperty("test.com");
  6. password.set("example.com");
  7. System.out.println("Modified StringProperty " + password.get() );
  8. }
  9. }

上面的代码声明了类型为StringProperty的变量password,并分配给SimpleStringProperty类的实例。实际的值是字符串“test.com”,它被传递到SimpleStringProperty类的构造函数中。
要读取值,请调用get()方法或getValue()方法,该方法返回实际的包装值。如果要修改这个值,请调用set()方法或setValue()并传入一个字符串值。

只读属性

要创建只读属性,请使用以ReadOnly作为前缀的包装类。创建只读属性需要两个步骤。

  1. 实例化只读包装类
  2. 调用方法getReadOnlyProperty()返回一个真正的只读属性对象
    1. ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("test.com");
    2. ReadOnlyStringProperty readOnlyUserName = userName.getReadOnlyProperty();

    JavaFX JavaBean

    以下代码显示了如何创建JavaFX JavaBean。当构建基于Swing的应用程序时,我们使用getter和setter创建JavaBean。
    然后我们必须通过Swing模型类在UI逻辑中获取和设置数据。通过使用JavaFX属性创建JavaFX JavaBean,JavaFX将执行数据绑定,并完成域模型类和UI控件之间的数据交换作业。参考以下代码 - ```java 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;

  1. public User() {
  2. userName = new ReadOnlyStringWrapper(this, USERNAME_PROP_NAME,"fake user");
  3. password = new SimpleStringProperty(this, PASSWORD_PROP_NAME, "");
  4. }
  5. public final String getUserName() {
  6. return userName.get();
  7. }
  8. public ReadOnlyStringProperty userNameProperty() {
  9. return userName.getReadOnlyProperty();
  10. }
  11. public final String getPassword() {
  12. return password.get();
  13. }
  14. public final void setPassword(String password) {
  15. this.password.set(password);
  16. }
  17. public StringProperty passwordProperty() {
  18. return password;
  19. }

}

  1. <a name="fYAYq"></a>
  2. ## 属性更改事件
  3. 属性可以通知值更改的事件处理程序,以便在属性更改时进行响应处理相关操作。JavaFX属性对象包含一个addListener()方法,它接受两种类型的功能接口:ChangeListener和invalidationListener。<br />所有JavaFX属性都是实现了ObservableValue和Observable接口,它们分别为ChangeListener和invalidationListener提供了addListener()方法。<br />以下代码显示如何创建ChangeListener来注册到属性。当属性的值发生改变时,将调用change()方法。
  4. ```java
  5. import javafx.beans.property.SimpleIntegerProperty;
  6. import javafx.beans.value.ChangeListener;
  7. import javafx.beans.value.ObservableValue;
  8. public class Main {
  9. public static void main(String[] args) {
  10. SimpleIntegerProperty xProperty = new SimpleIntegerProperty(0);
  11. // Adding a change listener with anonymous inner class
  12. xProperty.addListener(new ChangeListener<Number>() {
  13. @Override
  14. public void changed(ObservableValue<? extends Number> ov, Number oldVal,
  15. Number newVal) {
  16. System.out.println("old value:"+oldVal);
  17. System.out.println("new value:"+newVal);
  18. }
  19. });
  20. // Adding a change listener with lambda expression
  21. xProperty.addListener((ObservableValue<? extends Number> ov, Number oldVal,
  22. Number newVal) -> {
  23. System.out.println("old value:"+oldVal);
  24. System.out.println("new value:"+newVal);
  25. });
  26. }
  27. }

以下代码显示了如何创建一个invalidationListener以向属性注册。随着属性的值改变,将调用invalidated()方法。

  1. import javafx.beans.InvalidationListener;
  2. import javafx.beans.Observable;
  3. import javafx.beans.property.SimpleIntegerProperty;
  4. public class Main {
  5. public static void main(String[] args) {
  6. SimpleIntegerProperty xProperty = new SimpleIntegerProperty(0);
  7. // Adding a invalidation listener (anonymous inner class)
  8. xProperty.addListener(new InvalidationListener() {
  9. @Override
  10. public void invalidated(Observable o) {
  11. System.out.println(o.toString());
  12. }
  13. });
  14. // Adding a invalidation listener (lambda expression)
  15. xProperty.addListener((Observable o) -> {
  16. System.out.println(o.toString());
  17. });
  18. }
  19. }

ChangeListener和invalidationListener之间的区别。

  • 使用ChangeListener将可获取Observable(ObservableValue)的旧值和新值。
  • 使用invalidationListener只获取Observable对象(属性)