1. 程式人生 > >淺談JavaFX事件機制

淺談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來定義我們的變數,都可以通過上述形式來監聽改變。

  這一節就講到這裡了。

----------------------------------------------------------------------------------------

  臘月二十八了,還在公司上班中.....

  順便祝大家新年快樂!!

----------------------------------------------------------------------------------------