Java 入門指南 V2.00 - 單元 21 - 專案的檔案組成




以 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 ,然後用 FXMLLoaderload() 載入, load() 小括弧中還呼叫 getClass()getResource() ,並以 "FXMLDoucment.fxml" 當參數,先留意這裡,由於我們已經將 FXMLDoucment.fxml 改檔名為 EncryptorFXML.fxml ,因此這裡要修改成 "EncryptorFXML.fxml" 。至於這一整串是要取得 .fxml 文件,由 .fxml 文件變成 Parent 物件,再由 Parent 物件設定 Scene 物件,然後 Scene 物件設定 Stage 參數,最後 Stage 參數呼叫 show() 方法,順序如下


  1. 取得 .fxml 文件放進 Parent 物件。
  2. Parent 物件當參數設定 Scene 物件。
  3. Scene 物件當參數設定 Stage 參數。
  4. 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) implementsimplements 是實作的意思,就是要將介面 (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

重點整理


  1. Encryptor 專案的 M 是指 Encrypt.java , V 為 EncryptorFXML.fxml ,而 C 是 EncryptorControllor.java
  2. 繼承使用關鍵字 extends ,子類別會得到父類別所有的屬性及方法。
  3. 關鍵字 throws 表示某個方法丟出了個例外,凡是呼叫該方法的地方都要進行例外處理。
  4. Encryptor.java 為啟動 JavaFX 專案的類別,有一定的執行順序。
  5. .fxml 是屬於 XML 標記語言。
  6. 專案預設的 GUI 元件為一個按鈕及一個文字標籤,預設的事件是按下按鈕後在文字標籤顯示提示訊息。

問題與討論


  1. MVC 各自只能有一個類別,還是各自可以有很多個類別?
  2. 繼承是什麼?為什麼程式中要有繼承的功能?
  3. 啟動專案的順序為何?

the end

沒有留言: