国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 14:31:54
字體:
來源:轉載
供稿:網(wǎng)友

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

1. 屬性值

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

示例:

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

2. 綁定值

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

示例:

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

3. 可觀察的列表

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

示例:

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

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

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

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

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

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

5. Expressions

使用上述的 Bindings類,你可以創(chuàng)建出任何類型的表達式。比如說你有了兩個可以讓用戶輸入信息的文本域。現(xià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諸多特性的其中一點點。希望你可以找到更多利用這個事件系統(tǒng)的創(chuàng)造性方式!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大冶市| 德兴市| 房产| 临汾市| 仁化县| 子长县| 靖西县| 墨江| 琼海市| 新泰市| 江都市| 化隆| 苍南县| 普安县| 澜沧| 南雄市| 金山区| 北辰区| 侯马市| 浦县| 崇州市| 安义县| 乳源| 特克斯县| 南宫市| 商水县| 沂源县| 华容县| 闵行区| 蕲春县| 富源县| 甘谷县| 宁晋县| 和政县| 凤翔县| 宁明县| 日土县| 武胜县| 图们市| 藁城市| 沙河市|