利用JavaFX工具構(gòu)建Reactive系統(tǒ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)中的文字,一個列表中的子項以及復選框(checkbox)的狀態(tài)。屬性分成另類:可寫屬性和可讀屬性??蓪懼悼梢员恍薷模褂迷O(shè)置器方法或者直接修改。 JavaFX 會處理事件處置過程并確保每個依賴于此屬性的組件都會被通知到。可讀屬性擁有能讓你在其值被修改時接收到通知的方法。
示例:
// 可讀-且可寫
StringProperty name = new SimpleStringProperty("Emil");
// 只讀
ObservableBooleanValue nameIsEmpty = name.isEmpty();
2. 綁定值
當你擁有一個可寫和可讀值的時候,你可以開始就這些值如何關(guān)聯(lián)定義規(guī)則。一個可寫屬性可以被綁定到一個可讀屬性,如此其值總是會匹配到可讀的這個。綁定并不會立即發(fā)生,不過它們會在值被觀察之前進行(看看我在那里做的就明白了)。 綁定可以是單向或者雙向的。當然,如果它們之間是雙向的,就需要兩個屬性都是可寫的。
示例:
TextField fieldA = new TextField(); TextField fieldB = new TextField(); fieldA.prefWidthProperty().bind(fieldB.widthProperty());
3. 可觀察的列表
屬性并不是唯一可以被觀察的東西。如果列表是被封裝到了一個 ObservableList 中,那么列表的成員同樣也是可以被觀察到的。ObservableList 的響應(yīng)模型是相當先進的。你不僅能在列表被修改時收到通知,也可以看到列表具體是如何被修改的。
示例:
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]
如你所見,設(shè)置操作只會觸發(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)建出任何類型的表達式。比如說你有了兩個可以讓用戶輸入信息的文本域?,F(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)造性方式!
相關(guān)文章
JAVA實現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解
這篇文章主要介紹了JAVA實現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解,具有一定參考價值,需要的朋友可以了解下。2017-11-11
Java 可視化垃圾回收_動力節(jié)點Java學院整理
Ben Evans是一名資深培訓師兼顧問,他在演講可視化垃圾回收中從基礎(chǔ)談起討論了垃圾回收。以下是對其演講的簡短總結(jié)。感興趣的朋友一起學習吧2017-05-05
IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼
這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題
BigDecimal是Java在java.math包中提供的線程安全的API類,用來對超過16位有效位的數(shù)進行精確的運算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見問題,需要的朋友可以參考下2023-08-08
IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

