2024年12月1日 星期日

how to write change event handlers for JavaFX components

在 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) -> {...}
           )
        );

沒有留言: