Java開發筆記(一百四十四)實現FXML對應的控制器

前面介紹瞭如何經過fxml文件編排界面佈局,但是光有靜態界面根本無法處理業務,必須另外書寫業務邏輯的代碼,方能響應各按鈕的單擊事件,並將業務結果即便呈現到界面上。顯然,fxml內部寫不了Java代碼,同時入口程序已經把控件都託管給了fxml文件,也沒法在Application代碼中干預控件的操做。既然整個界面都託付給了fxml,那麼解鈴還須繫鈴人,只能且必須由fxml指定後續的邏輯控制器。具體作法是在fxml的根節點中添加屬性「fx:controller」,經過該屬性設置當前界面的控制器路徑。好比以前的登陸佈局文件login_with_flow.fxml,它的根節點是流式窗格FlowPane,因此就給FlowPane節點補充「fx:controller」的取值,詳細的標籤例子見下:html

<FlowPane fx:controller="com.javafx.fxml.LoginController"
	xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="5" vgap="5">

 

由以上的FlowPane標籤可知,它指定的控制器路徑爲「com.javafx.fxml.LoginController」,這個LoginController類正是login_with_flow.fxml對應的控制器代碼。做爲FXML專屬的搭檔,控制器也要符合必定的格式規範,首先它必須實現了接口Initializable,並重寫該接口定義的initialize方法,這個方法顧名思義會在界面初始化之時調用。其次,控制器內部須要聲明FXML文件定義好的控件編號,這樣才能經過控件編號操做每一個控件對象。下面即是一個控制器範本的代碼示例:java

//界面控制器必須實現自接口Initializable
public class LoginController implements Initializable {
	@FXML
	private 控件類型 控件編號; // 其中控件類型爲JavaFX的控件類名,控件編號取自fxml文件中的fx:id

	@Override
	public void initialize(URL location, ResourceBundle resources) { // 界面打開後的初始化操做
		// 可在此給各控件設置單擊事件或者選中事件,也可設置控件上的文本字體及其大小
	}
}

仍之前述的登陸窗口爲例,它的佈局文件名叫login_with_flow.fxml,同時fxml文件設定了界面對應的控制器叫作LoginController。注意到登陸窗口擁有兩個單選按鈕和一個登陸按鈕,這三個按鈕都應當觸發單擊或者選中事件,因而在控制器的代碼中分別聲明幾個待操做的控件對象,對象名稱與fxml中的fx:id保持一致。而後重寫控制器的initialize方法,在該方法中各自調用三個按鈕的setOnAction方法,用以註冊單擊或選中按鈕後的觸發事件。根據以上說明編寫登陸窗口的控制器代碼示例以下:ide

//登陸窗口的界面控制器
public class LoginController implements Initializable {
	@FXML
	private RadioButton rbPassword; // 密碼登陸對應的單選按鈕
	@FXML
	private RadioButton rbVerifycode; // 驗證碼登陸對應的單選按鈕
	@FXML
	private Label labelUser; // 用戶名標籤
	@FXML
	private TextField fieldUser; // 用戶名輸入框
	@FXML
	private Label labelPassword; // 密碼標籤
	@FXML
	private PasswordField fieldPassword; // 密碼輸入框
	@FXML
	private Button btnLogin; // 登陸按鈕
	@FXML
	private Label labelLoginResult; // 登陸結果標籤

	@Override
	public void initialize(URL location, ResourceBundle resources) { // 界面打開後的初始化操做
		rbPassword.setOnAction(e -> { // 選中「密碼登陸」單選按鈕後觸發的事件
			labelUser.setText("用戶名:");
			labelPassword.setText("密 碼:");
		});
		rbVerifycode.setOnAction(e -> { // 選中「驗證碼登陸」單選按鈕後觸發的事件
			labelUser.setText("手機號:");
			labelPassword.setText("驗證碼:");
		});
		// 
		btnLogin.setOnAction(e -> { // 單擊「登陸」按鈕後觸發的事件
			String result = String.format("您輸入的用戶名爲%s,密碼爲%s", 
					fieldUser.getText(), fieldPassword.getText());
			labelLoginResult.setText(result); // 在登陸結果標籤上顯示登陸信息
		});
	}
}

由上面代碼可見,這個控制器的處理邏輯很簡單,選中按鈕後僅僅給文本標籤設置指定文字而已,固然這樣也方便觀察控件的操做結果。佈局

回到登陸窗口的入口代碼LoginMain,運行測試程序彈出以下圖所示的登陸界面。測試


由圖示可見登陸窗口默認選中「密碼登陸」,接着單擊右邊的「驗證碼登陸」按鈕,發現下方的用戶名標籤變成了「手機號:」,密碼標籤變成了「驗證碼:」,說明「驗證碼登陸」按鈕的選中事件被正常觸發。而後分別在用戶名輸入框與密碼輸入框中填入用戶名和密碼,再單擊下面的登陸按鈕,此時登陸窗口的界面效果以下圖所示。字體


果不其然,登陸按鈕下方的文本標籤展現了輸入的用戶名和密碼信息,可知登陸按鈕的單擊事件也正確響應了。code



更多Java技術文章參見《Java開發筆記(序)章節目錄orm

相關文章
相關標籤/搜索