欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用JavaFX工具構(gòu)建Reactive系統(tǒng)

 更新時(shí)間:2016年02月29日 15:08:58   作者:leoxu  
這篇文章主要介紹了使用JavaFX構(gòu)建Reactive系統(tǒng),利用JavaFX工具集中的新的超棒特性來構(gòu)建響應(yīng)式的快速應(yīng)用程序,感興趣的小伙伴們可以參考一下

JavaFX 是Java中用來構(gòu)建圖形應(yīng)用程序的新的標(biāo)準(zhǔn)庫, 但許多程序員仍然堅(jiān)持在使用Swing甚至AWT。關(guān)于如何利用JavaFX工具集中的新的超棒特性來構(gòu)建響應(yīng)式的快速應(yīng)用程序,這里有一些建議!

1. 屬性值

如果你對JavaFX組件做過完整的了解,移動(dòng)遇到過屬性(Property)這個(gè)東西。FX庫中幾乎每個(gè)值都可以被觀察,分區(qū)(divider)的寬度,圖片的尺寸,文本標(biāo)識(shí)(label)中的文字,一個(gè)列表中的子項(xiàng)以及復(fù)選框(checkbox)的狀態(tài)。屬性分成另類:可寫屬性和可讀屬性??蓪懼悼梢员恍薷?,使用設(shè)置器方法或者直接修改。 JavaFX 會(huì)處理事件處置過程并確保每個(gè)依賴于此屬性的組件都會(huì)被通知到。可讀屬性擁有能讓你在其值被修改時(shí)接收到通知的方法。

示例:

// 可讀-且可寫
StringProperty name = new SimpleStringProperty("Emil"); 
// 只讀
ObservableBooleanValue nameIsEmpty = name.isEmpty();

2. 綁定值

當(dāng)你擁有一個(gè)可寫和可讀值的時(shí)候,你可以開始就這些值如何關(guān)聯(lián)定義規(guī)則。一個(gè)可寫屬性可以被綁定到一個(gè)可讀屬性,如此其值總是會(huì)匹配到可讀的這個(gè)。綁定并不會(huì)立即發(fā)生,不過它們會(huì)在值被觀察之前進(jìn)行(看看我在那里做的就明白了)。 綁定可以是單向或者雙向的。當(dāng)然,如果它們之間是雙向的,就需要兩個(gè)屬性都是可寫的。

示例:

TextField fieldA = new TextField();
TextField fieldB = new TextField();
fieldA.prefWidthProperty().bind(fieldB.widthProperty());

3. 可觀察的列表

屬性并不是唯一可以被觀察的東西。如果列表是被封裝到了一個(gè) ObservableList 中,那么列表的成員同樣也是可以被觀察到的。ObservableList 的響應(yīng)模型是相當(dāng)先進(jìn)的。你不僅能在列表被修改時(shí)收到通知,也可以看到列表具體是如何被修改的。

示例:

List<String> otherList = Arrays.asList("foo", "bar", "bar");
ObservableList<String> list = FXCollections.observableList(otherList);

list.addListener((ListChangeListener.Change<? extends String> change) -> {
  System.out.println("Received event.");
  while (change.next()) {
    if (change.wasAdded()) {
      System.out.println(
        "Items " + change.getAddedSubList() + " was added.");
    }

    if (change.wasRemoved()) {
      System.out.println(
        "Items " + change.getRemoved() + " was removed.");
    }
  }
});

System.out.println("Old list: " + list);
list.set(1, "foo");
System.out.println("New list: " + list);

上面代碼的運(yùn)行輸出如下:

Old list: [foo, bar, bar]
Received event.
Items [foo] was added.
Items [bar] was removed.
New list: [foo, foo, bar]

如你所見,設(shè)置操作只會(huì)觸發(fā)一次事件。

4. StringConverter
有時(shí)你會(huì)發(fā)現(xiàn)自己要?jiǎng)?chuàng)建一個(gè)綁定時(shí)無需去提取一個(gè)組件中的值。 這個(gè)的典型示例就是你有了一個(gè)從一個(gè)文本域(TextField)獲取到的帶有path 的 StringProperty。如果你想要有一個(gè)帶有表示為Path的這個(gè)值的可觀察屬性,就需要去為它創(chuàng)建一個(gè)StringConverter。
示例:

TextField fileLocation = new TextField();
StringProperty location = fileLocation.textProperty();
Property<Path> path = new SimpleObjectProperty<>();
 
Bindings.bindBidirectional(location, path, new StringConverter<Path>() {
  @Override
  public String toString(Path path) {
    return path.toString();
  }
 
  @Override
  public Path fromString(String string) {
    return Paths.get(string);
  }
});

對象屬性并不是跟文本域的值進(jìn)行的雙向綁定。

5. Expressions

使用上述的 Bindings類,你可以創(chuàng)建出任何類型的表達(dá)式。比如說你有了兩個(gè)可以讓用戶輸入信息的文本域。現(xiàn)在想要定義一個(gè)只讀域,其中總是會(huì)包含一個(gè)字符串,如果兩個(gè)串的長度相等,將會(huì)是兩個(gè)串逐個(gè)字符間隔混在一起進(jìn)行顯示。如果長度不等,則顯示一條幫助信息。
示例:

TextField first = new TextField();
TextField second = new TextField();
TextField mix  = new TextField();
 
mix.textProperty().bind(
  Bindings.when(
    first.lengthProperty().isEqualTo(second.lengthProperty())
  ).then(Bindings.createStringBinding(
    () -> {
      int length    = first.lengthProperty().get();
      String firstText = first.textProperty().get();
      String secondText = second.textProperty().get();
      char[] result   = new char[length * 2];
 
      for (int i = 0; i < length; i++) {
        result[i * 2]   = firstText.charAt(i);
        result[i * 2 + 1] = secondText.charAt(i);
      }
 
      return new String(result);
    }, 
    first.textProperty(),
    second.textProperty()
  )).otherwise("Please enter two strings of exactly the same length.")
);

這里只是JavaFX諸多特性的其中一點(diǎn)點(diǎn)。希望你可以找到更多利用這個(gè)事件系統(tǒng)的創(chuàng)造性方式!

相關(guān)文章

  • SpringBoot整合Liquibase的示例代碼

    SpringBoot整合Liquibase的示例代碼

    本篇文章給大家介紹SpringBoot整合Liquibase的兩種情況分析,看似整合問題很簡單,但是很容易出錯(cuò),下面小編給大家介紹下整合步驟,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解

    JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解

    這篇文章主要介紹了JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java 可視化垃圾回收_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 可視化垃圾回收_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Ben Evans是一名資深培訓(xùn)師兼顧問,他在演講可視化垃圾回收中從基礎(chǔ)談起討論了垃圾回收。以下是對其演講的簡短總結(jié)。感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼

    這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • JAVA 枚舉單例模式及源碼分析的實(shí)例詳解

    JAVA 枚舉單例模式及源碼分析的實(shí)例詳解

    這篇文章主要介紹了 JAVA 枚舉單例模式及源碼分析的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題

    BigDecimal是Java在java.math包中提供的線程安全的API類,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見問題,需要的朋友可以參考下
    2023-08-08
  • IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼

    IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼

    這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中線程安全問題

    Java中線程安全問題

    這篇文章主要介紹了Java中線程安全問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Java通俗易懂系列設(shè)計(jì)模式之模板模式

    Java通俗易懂系列設(shè)計(jì)模式之模板模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之模板模式,想了解設(shè)計(jì)模式的同學(xué),可以仔細(xì)看一下
    2021-04-04
  • 使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例

    使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例

    這篇文章主要介紹了使用Java實(shí)現(xiàn)2048小游戲代碼實(shí)例,2048 游戲是一款益智類游戲,玩家需要通過合并相同數(shù)字的方塊,不斷合成更大的數(shù)字,最終達(dá)到2048,游戲規(guī)則簡單,但挑戰(zhàn)性很高,需要玩家靈活運(yùn)用策略和計(jì)算能力,本文將使用Java代碼實(shí)現(xiàn),需要的朋友可以參考下
    2023-10-10

最新評論