在 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) -> {...} ) );
2024年12月1日 星期日
how to write change event handlers for JavaFX components
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言