激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 利用JavaFX工具構(gòu)建Reactive系統(tǒng)

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

2020-04-07 11:28leoxu JAVA教程

這篇文章主要介紹了使用JavaFX構(gòu)建Reactive系統(tǒng),利用JavaFX工具集中的新的超棒特性來構(gòu)建響應(yīng)式的快速應(yīng)用程序,感興趣的小伙伴們可以參考一下

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

1. 屬性值

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

示例:

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

2. 綁定值

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

示例:

?
1
2
3
TextField fieldA = new TextField();
TextField fieldB = new TextField();
fieldA.prefWidthProperty().bind(fieldB.widthProperty());

3. 可觀察的列表

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

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);

上面代碼的運行輸出如下:

?
1
2
3
4
5
Old list: [foo, bar, bar]
Received event.
Items [foo] was added.
Items [bar] was removed.
New list: [foo, foo, bar]

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
  }
});

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

5. Expressions

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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諸多特性的其中一點點。希望你可以找到更多利用這個事件系統(tǒng)的創(chuàng)造性方式!

延伸 · 閱讀

精彩推薦
  • JAVA教程Java使用Deque實現(xiàn)堆棧的方法

    Java使用Deque實現(xiàn)堆棧的方法

    這篇文章主要介紹了Java使用Deque實現(xiàn)堆棧的方法,實例分析了java簡單實現(xiàn)堆棧的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    鑒客2012019-12-27
  • JAVA教程java對象初始化順序驗證示例

    java對象初始化順序驗證示例

    以下這段小程序?qū)φ{(diào)用對象構(gòu)造函數(shù)時,父類構(gòu)造函數(shù)、成員變量初始化函數(shù),以及非靜態(tài)初始化塊調(diào)用順序進行驗證,不考慮靜態(tài)成員及靜態(tài)初始化塊...

    java教程網(wǎng)4562019-11-05
  • JAVA教程Java解析Excel內(nèi)容的方法

    Java解析Excel內(nèi)容的方法

    這篇文章主要介紹了Java解析Excel內(nèi)容的方法,實例分析了java解析excel文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    damaolly1222019-12-12
  • JAVA教程java內(nèi)存溢出示例(堆溢出、棧溢出)

    java內(nèi)存溢出示例(堆溢出、棧溢出)

    這篇文章主要介紹了java內(nèi)存溢出示例(堆溢出、棧溢出),需要的朋友可以參考下 ...

    Java教程網(wǎng)2202019-11-21
  • JAVA教程Java進階教程之異常處理

    Java進階教程之異常處理

    這篇文章主要介紹了Java進階教程之異常處理,本文講解了JAVA的異常處理機制、異常的類型、拋出異常、自定義異常等內(nèi)容,需要的朋友可以參考下 ...

    Vamei2912019-11-27
  • JAVA教程JAVA隨機打亂數(shù)組順序的方法

    JAVA隨機打亂數(shù)組順序的方法

    這篇文章主要介紹了JAVA隨機打亂數(shù)組順序的方法,包含了隨機數(shù)的應(yīng)用及數(shù)組的排序等操作,是Java操作數(shù)組的典型應(yīng)用,需要的朋友可以參考下 ...

    shichen20141252019-12-06
  • JAVA教程java觀感示例分享

    java觀感示例分享

    這篇文章主要介紹了java觀感示例,該實例查詢并生成了系統(tǒng)中存在觀感對應(yīng)的按鈕并在用戶點擊相應(yīng)按鈕時將窗口的觀感切換到指定的觀感上 ...

    java技術(shù)網(wǎng)1212019-11-12
  • JAVA教程Java簡單獲取字符串像素的方法

    Java簡單獲取字符串像素的方法

    這篇文章主要介紹了Java簡單獲取字符串像素的方法,涉及Java針對字符串字體操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    ruknow2042020-01-12
主站蜘蛛池模板: 国产精品成人免费一区久久羞羞 | 一区二区三区四区在线观看视频 | 蜜桃一本色道久久综合亚洲精品冫 | 精品国产一级毛片 | 九九视频精品在线 | 成码无人av片在线观看网站 | 亚洲午夜在线观看 | 欧美日韩亚洲国产 | 偿还电影免费看 | 牛牛视频在线 | 毛片福利 | 精品国产精品久久 | 日本综合久久 | 玖玖视频精品 | 成人免费自拍视频 | 欧美一级黄色片免费观看 | 一区在线看 | 成人免费av在线播放 | 美国一级免费视频 | 成人性视频在线 | 国产精品成人免费一区久久羞羞 | 精品xxxx户外露出视频 | 欧美成人鲁丝片在线观看 | www.99热精品 | 欧产日产国产精品乱噜噜 | 国产一区二区在线免费 | 成人午夜网址 | 国产日韩大片 | 国产成人综合在线观看 | 免费国产一区二区视频 | jizzzxxxxhd | 黄视频免费在线观看 | 欧美一区中文字幕 | 免费在线观看成年人视频 | 深夜影院一级毛片 | 九九热视频免费观看 | av电影在线观看网站 | 成人午夜免费在线观看 | 久久九九热re6这里有精品 | 免费在线成人网 | 黄色一级毛片免费看 |