以 MVC 模式來看我們發展的專案 (project) , M 是指 Encrypt 類別 (class) ,也就是我們已經開發好的 Encrypt.java , V 為 NetBeans 自動產生的 EncryptorFXML.fxml , C 則是 EncryptorControllor.java
稍候的單元才會整合 Encrypt.java ,我們先來打開 encryptor 套件資料夾,看看專案內有哪些檔案
V 及 C 都在,還有個獨立的 Encryptor.java ,這是用來啟動整個專案的類別。我們略過註解的部份,先來靠近看看 Encryptor.java 的內容吧!首先,第 6 行到第 12 行
先是宣告 Encryptor.java 在套件 (package) encryptor 中,然後 import 需要的類別,底下我們就會看到這些類別了
第 18 行宣告 Encryptor 類別後用了 extends 關鍵字, extends 的意思是繼承 (inherit) ,所謂繼承是指 Encryptor 會得到 Application 的所有屬性 (field) 跟方法 (method) 。這讓 Encryptor 類別變成了一種 Application , JavaFX 中的 Application 就是個應用程式類別。底下第 20 行的 @Override ,這是一個讓編譯器檢查的指令,因為 start() 是原本 Application 就有的方法,利用 @Override 是讓編譯器檢查 start() 的方法名稱及小括弧中的參數列是否與 Application 中的相同。 start() 需要一個 Stage 型態的參數,小括弧後面接了一個關鍵字 throws ,這是宣告 start() 會丟出一個例外 (exception) ,使用 start() 的地方要用 try-catch 進行例外處理 (exception handling) ,倒是我們自己寫的程式碼不會呼叫 start() ,因此不需要寫到 try-catch 陳述 (statement) 。
第 22 行宣告型態 Parent 的物件 root ,然後用 FXMLLoader 的 load() 載入, load() 小括弧中還呼叫 getClass() 的 getResource() ,並以 "FXMLDoucment.fxml" 當參數,先留意這裡,由於我們已經將 FXMLDoucment.fxml 改檔名為 EncryptorFXML.fxml ,因此這裡要修改成 "EncryptorFXML.fxml" 。至於這一整串是要取得 .fxml 文件,由 .fxml 文件變成 Parent 物件,再由 Parent 物件設定 Scene 物件,然後 Scene 物件設定 Stage 參數,最後 Stage 參數呼叫 show() 方法,順序如下
- 取得 .fxml 文件放進 Parent 物件。
- 以 Parent 物件當參數設定 Scene 物件。
- 以 Scene 物件當參數設定 Stage 參數。
- Stage 參數呼叫 show() 方法。
基本上我們認識 JavaFX 應用程式需要經過這樣順序就可以了,除非打算學自己手動刻實際細節的程式碼,不然由編譯器替我們完成那許多繁瑣的工作即可。
我們接著切換到 EncryptorFXML.fxml
有一個地方我們需要手動修改,找到 fx:controller="FXMLDocumentController" 的地方,把 "FXMLDocumentController" 改成 "EncryptorController"
仔細看一下 EncryptorFXML.fxml ,這是屬於 XML 標記語言,不用擔心 XML 的問題,我們稍候會用 JavaFX Scene Builder 來編輯這個文件。
再切換到 EncryptorController.java ,這是控制 GUI 與使用者互動的類別,也是 MVC 模式中, M 與 V 交流的 C 。同樣跳過註解,第 6 行宣告為 encryptor 套件,第 8 行到第 13 行引入需要的類別及介面
往下繼續看到 EncryptorController.java 定義的部份
類別識別字 EncryptorController 後面接的是關鍵字 (keyword) implements , implements 是實作的意思,就是要將介面 (interface) Initializable 裡宣告的所有方法都實作出來。這裡的介面不是指程式與使用者互動的介面,而是程式與程式間互通的管道,簡單說, Java 的介面是一種類別共通的規範,只要實作了某個介面,如此例的 Initializable ,就要將該介面宣告的方法都實作出來,這裡 Initializable 需要實作 initialize() 方法,預設只有留 // TODO 的註解,其他空白。
方法定義的大括弧內若是空白,就表示這個方法不做任何的事情。其他有一個標記為 @FXML 的屬性 label ,以及一個同是標記成 @FXML 的方法 handleButtonAction() , label 是預設在 GUI 裡的文字標籤,而 handleButtonAction() 則是 GUI 中與按鈕連動的方法。
我們先來看看專案的執行結果囉!如下
視窗裡有一個按鈕跟一個顯示訊息的文字標籤,按下按鈕就會在文字標籤上顯示 Hello World! ,下面的輸出視窗則顯示 You clicked me! ,這兩個動作都設定在 handleButtonAction() 中。
下一個單元我們先來看看怎麼用 JavaFX Scene Builder 設計介面囉!
中英文術語對照
專案 | project |
類別 | class |
套件 | package |
繼承 | inherit |
屬性 | field |
方法 | method |
例外 | exception |
例外處理 | exception handling |
陳述 | statement |
關鍵字 | keyword |
介面 | interface |
重點整理
- Encryptor 專案的 M 是指 Encrypt.java , V 為 EncryptorFXML.fxml ,而 C 是 EncryptorControllor.java 。
- 繼承使用關鍵字 extends ,子類別會得到父類別所有的屬性及方法。
- 關鍵字 throws 表示某個方法丟出了個例外,凡是呼叫該方法的地方都要進行例外處理。
- Encryptor.java 為啟動 JavaFX 專案的類別,有一定的執行順序。
- .fxml 是屬於 XML 標記語言。
- 專案預設的 GUI 元件為一個按鈕及一個文字標籤,預設的事件是按下按鈕後在文字標籤顯示提示訊息。
問題與討論
- MVC 各自只能有一個類別,還是各自可以有很多個類別?
- 繼承是什麼?為什麼程式中要有繼承的功能?
- 啟動專案的順序為何?
the end
沒有留言:
張貼留言