JavaFX入門(七)之使用FXML建立使用者介面
本教程展示了使用JavaFX FXML的好處,JavaFX FXML是一種基於XML的語言,它提供了構建與程式碼的應用程式邏輯分開的使用者介面的結構。
如果您從一開始就開始使用本文件,那麼您已經瞭解瞭如何使用JavaFX建立登入應用程式。在這裡,您使用FXML建立相同的登入使用者介面,將應用程式設計與應用程式邏輯分離,從而使程式碼更易於維護。您在本教程中構建的登入使用者介面如圖6-1所示。
圖6-1登入使用者介面
本教程使用NetBeans IDE。確保您使用的NetBeans IDE版本支援JavaFX 8.有關詳細資訊,請參閱Java SE下載頁面的“認證系統配置”部分。
1、設定專案
您的第一個任務是在NetBeans IDE中設定JavaFX FXML專案:
-
從“ 檔案”選單中,選擇“ 新建專案”。
-
在JavaFX應用程式類別中,選擇JavaFX FXML Application。單擊下一步。
-
將專案命名為FXMLExample,然後單擊Finish。
NetBeans IDE開啟一個FXML專案,其中包含基本Hello World應用程式的程式碼。該應用程式包括三個檔案:
-
FXMLExample.java.
該檔案負責FXML應用程式所需的標準Java程式碼。 -
FXMLDocument.fxml.
這是您在其中定義使用者介面的FXML原始檔。 -
FXMLDocumentController.java.
這是用於處理滑鼠和鍵盤輸入的控制器檔案。
-
-
重新命名
FXMLDocumentController.java
為F,XMLExampleController.java
以使該名稱對此應用程式更有意義。-
在“專案”視窗中,右鍵單擊“ FXMLDocumentController.java”,然後選擇“ 重構”,然後選擇“ 重新命名”。
-
輸入FXMLExampleController,然後單擊“ 重構”。
-
-
重新命名
FXMLDocument.fxml
為fxml_example.fxml.
-
右鍵單擊FXMLDocument.fxml並選擇“ 重新命名”。
-
輸入fxml_example並單擊“ 確定”。
-
2、載入FXML原始檔
您編輯的第一個檔案是FXMLExample.java
檔案。此檔案包含用於設定應用程式主類和定義舞臺和場景的程式碼。更具體的FXML,該檔案使用FXMLLoader
該類,該類負責載入FXML原始檔並返回結果物件圖。
在例6-1中進行粗體顯示的更改。
例6-1 FXMLExample.java
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));
Scene scene = new Scene(root, 300, 275);
stage.setTitle("FXML Welcome");
stage.setScene(scene);
stage.show();
}
一個好的做法是在建立場景時設定場景的高度和寬度,在本例中為300乘275; 否則場景預設為顯示其內容所需的最小尺寸。
3、修改匯入語句
接下來,編輯該fxml_example.fxml
檔案。此檔案指定應用程式啟動時顯示的使用者介面。第一項任務是修改import語句,使程式碼如例6-2所示。
示例6-2 XML宣告和匯入語句
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
與在Java中一樣,類名可以是完全限定的(包括包名),也可以使用import語句匯入它們,如例6-2所示。如果您願意,可以使用引用類的特定import語句。
4、建立GridPane佈局
NetBeans生成的Hello World應用程式使用AnchorPane
佈局。對於登入表單,您將使用GridPane
佈局,因為它使您能夠建立靈活的行和列網格,以在其中佈置控制元件。
刪除AnchorPane
佈局及其子項,並將其替換GridPane
為示例6-3中的佈局。
示例6-3 GridPane佈局
<GridPane fx:controller="fxmlexample.FXMLExampleController"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<padding><Insets top="25" right="25" bottom="10" left="25"/></padding>
</GridPane>
在此應用程式中,GridPane
佈局是FXML文件的根元素,因此具有兩個屬性。fx:controller
在標記中指定基於控制器的事件處理程式時,該屬性是必需的。該xmlns:fx
屬性始終是必需的,並指定fx
名稱空間。
程式碼的其餘部分控制網格窗格的對齊和間距。alignment屬性將網格的預設位置從場景的左上角更改為中心。在gap
效能管理行和列之間的間距,而padding
物業管理圍繞網格窗格邊緣的空間。
在調整視窗大小時,網格窗格中的節點將根據其佈局約束進行調整大小。在此示例中,當您增大或縮小視窗時,網格將保留在中心。填充屬性確保在使視窗變小時網格周圍有填充。
5、新增文字和密碼欄位
回顧圖6-1,您可以看到登入表單需要標題“歡迎”以及用於從使用者收集資訊的文字和密碼欄位。例6-4中的程式碼是GridPane
佈局的一部分,必須放在</GridPane>
語句的上方。
示例6-4文字,標籤,TextField和密碼欄位控制元件
<Text text="Welcome"
GridPane.columnIndex="0" GridPane.rowIndex="0"
GridPane.columnSpan="2"/>
<Label text="User Name:"
GridPane.columnIndex="0" GridPane.rowIndex="1"/>
<TextField
GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label text="Password:"
GridPane.columnIndex="0" GridPane.rowIndex="2"/>
<PasswordField fx:id="passwordField"
GridPane.columnIndex="1" GridPane.rowIndex="2"/>
第一行建立一個Text
物件並將其文字值設定為Welcome
。的GridPane.columnIndex
和GridPane.rowIndex
屬性對應的放置Text
在網格控制。網格中行和列的編號從零開始,Text
控制元件的位置設定為(0,0),這意味著它位於第一行的第一列中。該GridPane.columnSpan
屬性設定為2,使歡迎標題跨越網格中的兩列。當您新增樣式表以將文字的字型大小增加到32磅時,您將在本教程後面需要這個額外的寬度。
下一行建立一個Label
物件,其中第User Name
0列,第1行為文字,第1列為第1行TextField
,右側為物件。另一行Label
和PasswordField
物件以類似方式建立並新增到網格中。
使用網格佈局時,可以顯示網格線,這對於除錯非常有用。在這種情況下,通過在語句後新增語句gridLinesVisible
來將屬性設定為。然後,當您執行應用程式時,您會看到網格列和行的行以及間隙屬性,如圖6-2所示。true
<gridLinesVisible>true</gridLinesVisible>
<padding></padding>
圖6-2帶網格線的登入表單
6、新增按鈕和文字
應用程式所需的最後兩個控制元件是Button
用於提交資料的Text
控制元件和用於在使用者按下按鈕時顯示訊息的控制元件。程式碼在例6-5中。之前新增此程式碼</GridPane>
。
例6-5 HBox,Button和Text
<HBox spacing="10" alignment="bottom_right"
GridPane.columnIndex="1" GridPane.rowIndex="4">
<Button text="Sign In"
onAction="#handleSubmitButtonAction"/>
</HBox>
<Text fx:id="actiontarget"
GridPane.columnIndex="0" GridPane.columnSpan="2"
GridPane.halignment="RIGHT" GridPane.rowIndex="6"/>
HBox
需要一個窗格來設定按鈕的對齊方式,該方框與應用於GridPane
佈局中其他控制元件的預設對齊方式不同。該alignment
屬性設定為bottom_right
,將空間底部的節點垂直放置,並在空間的右邊緣水平放置。該HBox
窗格將新增到第1列第4行的網格中。
該HBox
窗格有一個孩子,一個Button
與text
屬性設定為Sign in
和onAction
設定屬性handleSubmitButtonAction()
。雖然FXML是定義應用程式使用者介面結構的便捷方式,但它並未提供實現應用程式行為的方法。您可以handleSubmitButtonAction()
在本教程的下一部分“ 新增程式碼來處理事件”中實現Java程式碼中的方法行為。
分配一個fx:id
值到一個元素,如在對所述程式碼中所示Text
的控制,建立在文件的名稱空間的變數,該變數可以參考從程式碼的其他地方。雖然不是必需的,但定義控制器欄位有助於闡明控制器和標記的關聯方式。
7、新增程式碼來處理事件
現在,Text
當用戶按下按鈕時,控制元件會顯示一條訊息。你在FXMLExampleController.java
檔案中這樣做。刪除NetBeans IDE生成的程式碼,並將其替換為例6-6中的程式碼。
例6-6 FXMLExampleController.java
package fxmlexample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.text.Text;
public class FXMLExampleController {
@FXML private Text actiontarget;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("Sign in button pressed");
}
}
該@FXML
註釋被用於標記非公共控制器成員欄位和處理程式方法用於通過FXML標記使用。該handleSubmtButtonAction
方法將actiontarget
變數設定為Sign in button pressed
使用者按下按鈕時。
您現在可以執行該應用程式以檢視完整的使用者介面。圖6-3顯示了在兩個欄位中鍵入文字並單擊“登入”按鈕時的結果。如果您有任何問題,那麼您可以將您的程式碼與FXMLLogin示例進行比較。
圖6-3 FXML登入視窗
8、使用指令碼語言處理事件
作為使用Java程式碼建立事件處理程式的替代方法,您可以使用提供與JSR 223相容的指令碼引擎的任何語言來建立處理程式。這些語言包括JavaScript,Groovy,Jython和Clojure。
您可以選擇立即嘗試使用JavaScript。
-
在檔案中
fxml_example.fxml
,在XML doctype宣告之後新增JavaScript宣告。<?language javascript?>
-
在
Button
標記中,更改函式的名稱,以使呼叫如下所示:onAction="handleSubmitButtonAction(event);"
-
fx:controller
從GridPane
標記中刪除屬性,並將JavaScript函式<script>
直接新增到其下的標記中,如例6-7所示。例6-7 FXML中的JavaScript
<GridPane xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> <fx:script> function handleSubmitButtonAction() { actiontarget.setText("Calling the JavaScript"); } </fx:script>
或者,您可以將JavaScript函式放在外部檔案(例如
fxml_example.js
)中,幷包含如下指令碼:<fx:script source="fxml_example.js"/>
圖6-4使用JavaScript登入應用程式
如果您正在考慮使用FXML指令碼語言,請注意IDE可能不支援在除錯期間單步執行指令碼程式碼。
9、使用CSS設定應用程式樣式
最後的任務是通過新增層疊樣式表(CSS)使登入應用程式看起來很有吸引力。
-
建立樣式表。
-
在“專案”視窗中,右鍵單擊“源包”下的fxmlexample資料夾,然後選擇“ 新建”,再選擇“ 其他”。
-
在“新建檔案”對話方塊中,選擇“ 其他”,然後選擇“ 層疊樣式表”,並單擊“ 下一步”。
-
輸入Login並單擊Finish。
-
將
Login.css
檔案的內容複製到CSS檔案中。該Login.css
檔案包含在可下載的LoginCSS.zip檔案中。有關CSS檔案中的類的說明,請參閱使用JavaFX CSS的花式表單。
-
-
通過右鍵單擊background.jpg檔案並將其儲存到
fxmlexample
資料夾,下載背景的灰色亞麻影象。 -
開啟
fxml_example.fxml
檔案並在GridPane
佈局標記結束之前新增樣式表元素,如例6-8所示。例6-8樣式表
<stylesheets> <URL value="@Login.css" /> </stylesheets> </GridPane>
URL中樣式表名稱前面的@符號表示樣式表與FXML檔案位於同一目錄中。
-
要使用網格窗格的根樣式,請將樣式類新增到
GridPane
佈局的標記中,如例6-9所示。示例6-9設定GridPane的樣式
<GridPane fx:controller="fxmlexample.FXMLExampleController" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" styleClass="root">
-
welcome-text
為WelcomeText
物件建立一個ID,使其使用#welcome-text
CSS檔案中定義的樣式,如例6-10所示。示例6-10文字ID
<Text id="welcome-text" text="Welcome" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/>
-
執行該應用程式。圖6-5顯示了程式化的應用程式。如果遇到問題,請檢視可下載的FXMLExample.zip檔案中包含的程式碼
圖6-5樣式化登入應用程式
10、從這往哪兒走
既然您熟悉FXML,請檢視FXML 簡介,它提供了有關構成FXML語言的元素的更多資訊。該文件包含在API文件的javafx.fxml
包中。
您還可以通過fxml_example.fxml
在Scene Builder中開啟檔案並進行修改來試用JavaFX Scene Builder工具。此工具為JavaFX應用程式的UI設計提供了視覺化佈局環境,並自動為佈局生成FXML程式碼。請注意,儲存時可能會重新格式化FXML檔案。有關此工具的更多資訊,請參閱JavaFX Scene Builder入門。使用CSS進行Skinning和JavaFX Scene Builder使用者指南的CSS Analyzer部分,還可以為您提供有關如何為FXML佈局設定外觀的資訊。