Java 入門指南

單元 22 - 設定按鈕事件

~~學習進度表~~

使用者在 GUI 的操作,例如點擊按鈕,這就構成了一個事件 (event) ,處理事件就是 MVC 模式中 C 的主要任務

GUI ↔ Event

這裡先看到 FXMLDocumentController.java 預設的內容

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package encryptgui;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

/**
 *
 * @author KAICHING
 */
public class FXMLDocumentController implements Initializable {
    
    @FXML
    private Label label;
    
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
    
}

預設的註解 (comment) 及套件 (package) 跳過, import 的部分是引入程式庫 (library) 必要的內容,直接看到定義 class 的第一行

public class FXMLDocumentController implements Initializable {

這裡 Initializable 是介面 (interface) ,必須實作底下用 @Override 標示的 initialize()

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}

除了註解 // TODO 外留空,這是因為這個方法 (method) 是依需要自行定義,在我們的 JavaFX 專案中不需要替這個方法添加內容。

Android 專案中的 onCreate() 方法跟這個 initialize() 方法類似,簡單的 Andorid 專案,相關程式碼幾乎都可以直接寫在 onCreate() 方法中。

然後注意到這裡宣告了以 @FXML 標記的 Label 型態屬性 (field) label

@FXML
private Label label;

這是因為在預設的 FXMLDocument.fxml 中,有一個 id 設定成 labelLabel ,由於新版的 FXMLDocument.fxml 要用 iddisplayLabel 顯示提示訊息,因此這裡要把 label 改成 display ,如下

@FXML
private Label display;

完整程式請參考「範例程式篇」的 FXMLDocumentController.java

利用 @FXML 就表示跟 FXML 檔案連動,屬性識別字 (identifier) 即是視窗元件的 id

然後底下宣告的方法 handleButtonAction() 同樣是用 @FXML 標記

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    label.setText("Hello World!");
}

這裡是先在命命列顯示 "You clicked me!"

System.out.println("You clicked me!");

然後利用 LabelsetText() 方法設定標籤文字

label.setText("Hello World!");

以上是預設的程式碼,由於新版的 FXML 檔案跟七個按鈕連動的方法已改名稱,這裡由以下七個方法取代這個預設方法

@FXML
private void newMethod(ActionEvent event) {
    display.setText("新建");
}
    
@FXML
private void loadMethod(ActionEvent event) {
    display.setText("載入");
}
    
@FXML
private void saveMethod(ActionEvent event) {
    display.setText("存檔");
}
    
@FXML
private void encodeMethod(ActionEvent event) {
    display.setText("編碼");
}
    
@FXML
private void decodeMethod(ActionEvent event) {
    display.setText("解碼");
}
    
@FXML
private void copyMethod(ActionEvent event) {
    display.setText("拷貝");
}
    
@FXML
private void clearMethod(ActionEvent event) {
    display.setText("清空");
}

每個按鈕連動的方法都很簡單的在 display 設定該按鈕的文字,執行後會出現以下視窗

按下新建按鈕,就會顯示「新建」

現在每個按鈕都有連動的方法,下一個單元開始要來整合 Encrypt 類別 (class) 囉!

相關教學影片

上一頁 單元 21 - 利用 FXML 設計介面
回 Java 入門指南首頁
下一頁 單元 23 - 整合 Encrypt 類別
回 Java 教材首頁
回程式語言教材首頁
中英文術語對照
class類別
comment註解
event事件
identifier識別字
interface介面
method方法
package套件
參考資料
1. JavaFX 8.0: Introduction to FXML
2. JavaFX: Working with JavaFX UI Components - Label
3. JavaFX: Working with JavaFX UI Components - Button
4. JavaFX: Working with JavaFX UI Components - Text Field
重點整理
1. MVC 模式中的 C 種要是處理在 V 上發生的事件,例如使用者按下按鈕的事件。
2. JavaFX FXML 專案中,跟 FXML 檔案相關的屬性與方法必須用 @FXML 標記,屬性名稱就是 FXML 檔案中的 id
問題與討論
1. 事件是什麼?除了點擊按鈕是事件外,想一想,使用者還有哪些動作會構成事件?
2. JavaFX FXML 專案是怎麼進行事件處理的?
練習
1. 承接上一個單元的 HelloDemo 專案,增加一個 int 屬性 count ,然後在建構子中把 count 設定為 0
2. 承接上一個單元的 GuessGameDemo 專案,逐一加入十一個按鈕與 <TextArea>@FXML 屬性,按鈕為 button1button0<TextArea>display