淺談JavaFX事件機制
之前有人問到過JavaFX中,如何監聽視窗大小的變化。所以,我覺得有必要新開一篇文章來講解一下JavaFX的事
件機制以及與Java GUI 和 Android事件的區別。
在Java GUI 和Android中,事件通常通過實現listener的介面函式,並通過addXXXListener 或者setOnXXXListener的形式來設定介面函式來實現事件的執行。在Java GUI中,也有部分通過介面卡模式來讓使用者選
擇性的覆蓋事件函式(以免留下許多不需要的空方法)。
然而在JavaFX中,只有極少數的事件是遵循Java GUI和Android的模式,例如,按鈕的點選事件
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
}
});
其實我在以前的文章中,不止說過一次,JavaFX最重要的特性就是屬性繫結
這意味著什麼?我相信很多讀者可能也有一些明白了。
也就是說,JavaFX中,所有跟屬性有關的事件,將一概不會通過"控制元件.setOnXXXX"這種形式執行。而是通過屬性繫結來監聽屬性的改變,來執行事件。
例如,我們需要監聽視窗大小的改變:
primaryStage.widthProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) { System.out.println("Window Size Change:" + t.toString() + "," + t1.toString()); } });
大家可以看到,我們通過給stage的widthProperty新增ChangeListener來執行屬性改變的事件,同時
ChangeListener裡會回撥一個屬性改變前的值和屬性改變後的值。
再舉個例子, 我們要監聽CheckBox的選中事件, 在Android中我們監聽CheckBox的選中事件是通過
CheckBox.setOnCheckedChangeListener(.....)來執行的。由於JavaFX屬性繫結的特性,同樣事件監聽如下:
CheckBox cb = new CheckBox("CheckBox");
cb.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
System.out.println("CheckBox: " + " old value--" + t.toString() + " new value--" + t1.toString());
}
});
只需要監聽selectedProperty屬性即可。
其實,大家在初學使用JavaFX的時候,可能會非常不適應屬性繫結機制,會像Java和Android一樣,在API文件找setOnXXXX等形式的事件函式。但屬性繫結機制,毫無疑問是JavaFX的一大利器。
只需要記住,所有跟屬性改變相關的事件,都可以根據XXX.xxxxProperty().addListener的形式來執行事件。熟悉這個,將對我們的JavaFX開發產生很大便利。
另外補充說明,只要是通過javax.beans.property包中的xxxProperty來定義我們的變數,都可以通過上述形式來監聽改變。
這一節就講到這裡了。
----------------------------------------------------------------------------------------
臘月二十八了,還在公司上班中.....
順便祝大家新年快樂!!
----------------------------------------------------------------------------------------