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() );
}
}
上面的代码生成以下结果。
Modified StringProperty example.com
上面的代码声明了类型为StringProperty
的变量password
,并分配给SimpleStringProperty
类的实例。实际的值是字符串“yiibai.com”,它被传递到SimpleStringProperty
类的构造函数中。
要读取值,请调用get()
方法或getValue()
方法,该方法返回实际的包装值。如果要修改这个值,请调用set()
方法或setValue()
并传入一个字符串值。
只读属性
要创建只读属性,请使用以ReadOnly
作为前缀的包装类。创建只读属性需要两个步骤。
- 实例化只读包装类
- 调用方法
getReadOnlyProperty()
返回一个真正的只读属性对象
ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("yiibai.com");
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 {// 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);
});
}
}
以下代码显示了如何创建一个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
对象(属性)