JavaFX属性

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

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() );
  }
}

Java

上面的代码生成以下结果。

Modified StringProperty example.com

Java

上面的代码声明了类型为StringProperty的变量password,并分配给SimpleStringProperty类的实例。实际的值是字符串“yiibai.com”,它被传递到SimpleStringProperty类的构造函数中。

要读取值,请调用get()方法或getValue()方法,该方法返回实际的包装值。如果要修改这个值,请调用set()方法或setValue()并传入一个字符串值。

只读属性

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

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

Java

JavaFX JavaBean

以下代码显示了如何创建JavaFX JavaBean。当构建基于Swing的应用程序时,我们使用gettersetter创建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;
  }
}

Java

属性更改事件

属性可以通知值更改的事件处理程序,以便在属性更改时进行响应处理相关操作。JavaFX属性对象包含一个addListener()方法,它接受两种类型的功能接口:ChangeListenerinvalidationListener
所有JavaFX属性都是实现了ObservableValueObservable接口,它们分别为ChangeListenerinvalidationListener提供了addListener()方法。

以下代码显示如何创建ChangeListener来注册到属性。当属性的值发生改变时,将调用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);
      });
  }
}

Java

以下代码显示了如何创建一个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());
    });

  }
}

Java

ChangeListenerinvalidationListener之间的区别。

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaFX 属性是一种特殊的字段,可以在属性值发生变化时自动更新视图。JavaFX 属性有以下几个特点: 1. 可观察性:JavaFX 属性是可观察的,可以注册监听器来监听属性值的变化。 2. 绑定性:JavaFX 属性可以绑定到其他属性或表达式上,当被绑定的属性或表达式的值发生变化时,绑定属性的值也会随之变化。 3. 可写性:JavaFX 属性可以是可写的或只读的,可写属性的值可以通过 set 方法来修改,只读属性的值只能在创建时指定,之后不可修改。 4. 类型安全:JavaFX 属性具有类型安全性,因为属性的类型是在编译时确定的。 以下是一个简单的 JavaFX 属性示例: ``` import javafx.beans.property.*; public class Person { private StringProperty name = new SimpleStringProperty(); private IntegerProperty age = new SimpleIntegerProperty(); public String getName() { return name.get(); } public void setName(String name) { this.name.set(name); } public StringProperty nameProperty() { return name; } public int getAge() { return age.get(); } public void setAge(int age) { this.age.set(age); } public IntegerProperty ageProperty() { return age; } } ``` 在上面的示例中,Person 类具有两个 JavaFX 属性:name 和 age。name 属性是一个字符串属性,age 属性是一个整数属性。这些属性都具有 get 和 set 方法,以及对应的属性对象(nameProperty 和 ageProperty)。可以使用属性对象来注册监听器、绑定属性和获取属性值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值