JavaFX 屬性

2018-03-04 14:20 更新

JavaFX教程 - JavaFX屬性


JavaFX屬性存儲(chǔ)控件的內(nèi)部狀態(tài),并允許我們監(jiān)聽(tīng)來(lái)自JavaFX UI控件的狀態(tài)更改。

JavaFX屬性可以彼此綁定。綁定行為允許屬性根據(jù)來(lái)自另一個(gè)屬性的更改值來(lái)同步其值。

JavaFX屬性的類(lèi)型

有兩種類(lèi)型的JavaFX屬性:

  • 讀/寫(xiě)
  • 只讀

JavaFX的屬性包含實(shí)際值,并提供更改支持,無(wú)效支持和綁定功能。

所有JavaFX屬性類(lèi)都位于 javafx.beans.property.* 包命名空間中。

下面的列表是常用的屬性類(lèi)。

  • 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 的屬性是讀/寫(xiě)屬性類(lèi)。具有 ReadOnly 的屬性是只讀屬性。


讀/寫(xiě)屬性

讀/寫(xiě)屬性是可以讀取和修改的屬性值。

例如, SimpleStringProperty 類(lèi)創(chuàng)建一個(gè)字符串屬性,該屬性對(duì)包裝的字符串值是可讀寫(xiě)的。

以下代碼演示了一個(gè) SimpleStringProperty 類(lèi)的實(shí)例,并通過(guò)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() );
  }
}

上面的代碼生成以下結(jié)果。

上面的代碼聲明了類(lèi)型 StringProperty 的變量 password ,并分配給SimpleStringProperty 類(lèi)的一個(gè)實(shí)例。

實(shí)際的值是字符串“w3cschool.cn",它被傳遞到 SimpleStringProperty 類(lèi)的構(gòu)造函數(shù)中。

要讀取值,請(qǐng)調(diào)用 get()方法或 getValue()方法,該方法返回實(shí)際的包裝值。

要修改該值,請(qǐng)調(diào)用 set()方法或 setValue()并傳入一個(gè)字符串。


只讀屬性

要?jiǎng)?chuàng)建只讀屬性,請(qǐng)使用以 ReadOnly 作為前綴的包裝類(lèi)。

創(chuàng)建只讀屬性需要兩個(gè)步驟。

  1. 實(shí)例化只讀包裝類(lèi)
  2. 調(diào)用方法getReadOnlyProperty()返回一個(gè)真正的只讀屬性對(duì)象
ReadOnlyStringWrapper userName = new ReadOnlyStringWrapper("o2fo.com"); 
ReadOnlyStringProperty readOnlyUserName  = userName.getReadOnlyProperty();

JavaFX JavaBean

以下代碼顯示了如何創(chuàng)建JavaFX JavaBean。當(dāng)構(gòu)建基于Swing的應(yīng)用程序時(shí),我們使用getter和setter創(chuàng)建JavaBean。

然后我們必須通過(guò)Swing模型類(lèi)在UI邏輯中獲取和設(shè)置數(shù)據(jù)。通過(guò)使用JavaFX屬性創(chuàng)建JavaFX JavaBean,JavaFX將執(zhí)行數(shù)據(jù)綁定,并完成域模型類(lèi)和UI控件之間的數(shù)據(jù)交換作業(yè)。

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

屬性更改事件

屬性可以通知值更改事件處理程序,以在屬性更改時(shí)進(jìn)行響應(yīng)。

JavaFX屬性對(duì)象包含一個(gè)addListener()方法,它接受兩種類(lèi)型的功能接口:ChangeListener和invalidationListener。

所有JavaFX屬性都是ObservableValue和Observable接口的后代,它們分別為ChangeListener和invalidationListener提供了addListener()方法。

以下代碼顯示如何創(chuàng)建要注冊(cè)到屬性的ChangeListener。隨著屬性的值改變,將調(diào)用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);
      });
  }
}

以下代碼顯示如何創(chuàng)建一個(gè)invalidationListener以向?qū)傩宰?cè)。隨著屬性的值更改,將調(diào)用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之間的區(qū)別。

  • 使用ChangeListener,我們將獲得Observable(ObservableValue),舊值和新值。
  • 使用invalidationListener只獲取Observable對(duì)象(屬性)。
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)