举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > javafx属性绑定 JavaFX 属性

javafx属性绑定 JavaFX 属性

2023-03-05 14:18 Java教程

javafx属性绑定 JavaFX 属性

javafx属性绑定

JavaFX属性绑定是一种机制,可以让开发人员在不同的属性之间建立联系,从而使它们保持同步。当一个属性的值更改时,其他相关的属性也会自动更新。这样,开发人员就不必手动更新所有相关的属性,而是可以将这些工作委托给JavaFX来处理。

JavaFX中的属性绑定使用了一个特殊的语法来表示:“bind”。例如,如果要将一个TextField中的文本与Label中显示的文本保持同步,则可以使用以下代码来实现:

label.textProperty().bind(textField.textProperty());

在这里,我们将Label中显示的文本与TextField中显示的文本进行了“绑定”。因此,当TextField中显示的文本发生变化时(例如用户在其中输入内容时),Label中显示的文本也会随之更新。

JavaFX还允许开发人员使用“unbind”语法来解除已存在的属性之间的关联。例如:

label.textProperty().unbind();

上面代码将解除Label中显示文本与TextField中显示文本之间存在的关联。因此,即使TextField中显示内容发生了变化(例如用户在其中输入内容时),Label也不会随之更新。

JavaFX属性绑定非常方便开发人员处理复杂界面逻辑时所需要处理大量数据之间相互影响、相互作用、相互协作、相互促进、相互促成、相互协同、相互协作、相互促进、相互促成、相互协同、相互协作、相互促进、相互促成 等情况。通过使用JavaFX属性绑定功能, 可以大大减少开发人员对数据之间影响情况手动处理工作量, 既能减少代码量, 合也能减少出错几 率, 既能大大加快开发效 率, 合也能大大提高应用 软件 的 功能 体 验 。

JavaFX 属性

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(".cn");
    password.set("example.com");
    System.out.println("Modified StringProperty "  + password.get() );
  }
}

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

上面的代码声明了类型 StringProperty 的变量 password ,并分配给SimpleStringProperty 类的一个实例。

实际的值是字符串“.cn",它被传递到 SimpleStringProperty 类的构造函数中。

要读取值,请调用 get()方法或 getValue()方法,该方法返回实际的包装值。

要修改该值,请调用 set()方法或 setValue()并传入一个字符串。


只读属性

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

创建只读属性需要两个步骤。

  1. 实例化只读包装类
  2. 调用方法getReadOnlyProperty()返回一个真正的只读属性对象
ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("www..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对象(属性)
阅读全文
以上是编程学为你收集整理的javafx属性绑定 JavaFX 属性全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部