在 javafx.scene.control 套件路徑下,如下元件有更動屬性都會產生異動事件(Change Event),
TextField/CheckBox/ComboBox/RadioButton/ChoiceBox/Slider/ListView
可對元件屬性註冊異動事件處理器(Change Event Handler),接收異動事件,進行處理。
註冊異動事件處理器寫法,和註冊動作事件處理器寫法不同,
須利用.xxxProperty()方法先取得元件屬性,
再利用.addListener 方法為屬性添加異動監聽器,寫法如下:
textField.textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("value changed from " + oldValue + " to " + newValue);
});
或
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue observable,
String oldValue, String newValue) {
System.out.println("value changed from " + oldValue + " to " + newValue);
}
});
註1: 至於其他元件的異動事件處理器註冊,須搭配各元件的屬性取法不同,寫法如下:
checkBox.selectedProperty().addListener(...)
comboBox.valueProperty().addListener(...)
radioButton.selectedProperty().addListener(...)
choiceBox.getSelectionModel().selectedItemProperty().addListener(...)
slider.valueProperty().addListener(...)
listView.getSelectionModel().selectedItemProperty().addListener(...)
註2: JavaFX 有 javafx.event.ActionEvent 動作事件類別及物件,但沒有異動事件類別。
元件一旦有動作事件,通常屬於高階離散事件,立即一次性處理完即可,
故設計上註冊處理器寫法較簡單,只允許對元件呼叫如下方法,掛上單一動作監聽器。
setOnAction(event -> {...});
註3: 元件屬性一旦有異動事件,通常屬於低階連續事件,須要密集多次處理狀態變化,
故設計上註冊處理器寫法較細緻彈性,可對屬性呼叫如下方法,掛上多個異動監聽器。
addListener(
new javafx.beans.value.ChangeListener(
(ob, oldV, newV) -> {...}
)
);
how to write change event handlers for JavaFX components
訂閱:
張貼留言 (Atom)
Linked Lists from C to Java
「 C Pointer Concepts in Java 」一文提到 Java 沒有指標型別 (pointer type) ,但有參照型別 (reference type) 的設計。在遇到須要處理鏈結清單 (linked list)、圖形 (graph) 等資料結構時,Java ...
沒有留言:
張貼留言