Java 入門指南

單元 19 - 認識 Java API 與 JavaFX

~~學習進度表~~

API 的全名為 Application Programming Interface ,中文可稱之為應用程式介面,簡單來講 API 就是一個程式庫 (library) ,以 Java 而言就是個類別庫,具有各方面應用的類別 (class)

Java API → JavaFX

API 中的類別就是用套件 (package) 組織的,裡頭只有 java.lang 套件的類別可以直接使用,例如我們之前取得隨機數的 Math.random() ,而使用其他的類別都需要先 import ,像是處理時間日期的 Date 類別就在 java.util

/*
 * 檔名:APIDemo01.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
package apidemo01;
        
import java.util.Date;

public class APIDemo01 {
    public static void main(String[] args) {
        Date d = new Date();
        System.out.println(d);
    }
}

此例直接 import Date 類別

import java.util.Date;

然後在 main() 裡建立一個 Date 物件 (object) ,最後印出這個物件。執行結果如下

Tue Nov 19 13:25:26 CST 2019

常用的類別放在 java.lang 裡,例如 String 型態 (type) ,以下程式利用字串 (string) 物件的 replace() 方法 (method) 替換字串中的母音字母

/*
 * 檔名:APIDemo02.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
package apidemo02;

public class APIDemo02 {
    public static void main(String[] args) {
        String s = "There is no spoon.";
        System.out.println(s);
        String s1 = s.replace("a""e");
        System.out.println(s1);
        String s2 = s1.replace("e""i");
        System.out.println(s2);
        String s3 = s2.replace("i""o");
        System.out.println(s3);
        String s4 = s3.replace("o""u");
        System.out.println(s4);
        String s5 = s4.replace("u""a");
        System.out.println(s5);
    }
}

執行結果如下

There is no spoon.
There is no spoon.
Thiri is no spoon.
Thoro os no spoon.
Thuru us nu spuun.
Thara as na spaan.

API 的應用包括

Java 8 的 API 文件請參考 Java™ Platform, Standard Edition 8 API Specification

裡頭有各式各樣的應用,如果要好好介紹那會是一本大部頭的書了,我們先把焦點放在跟接下來發展 GUI 有關的部份, Java API 中有關 GUI 方面有三部分

AWT 為 Java 早期推出的 GUI API ,有很多缺點,於是後來又推出 Swing 來取代 AWT ,其實 Swing 是在 AWT 上重新開發的 API ,至於 JavaFX 是甲骨文公司於西元 2007 推出的新一代 GUI API ,比較符合現代化應用程式的程式設計方式。

基本上,無論 AWT 或是 Swing 都是全程式開發 GUI , JavaFX 則可以藉助 FXML 的設計格式, FXML 屬於 XML 格式的一種,在 Android 開發的部分也是大量使用 XML ,因此我們在下一篇會採用 JavaFX FXML 專案,來開發使用 Encrypt 類別的 GUI 軟體。

只是全程式開發 GUI 不好嗎?這要看情況來決定,例如以下為 JavaFX 用全程式寫的小應用

/*
 * 檔名:JavaFXDemo.java
 * 作者:張凱慶
 * 網站:http://kaiching.org
 */
package javafxdemo;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class JavaFXDemo extends Application {
    private int count = 0;
    
    @Override
    public void start(Stage primaryStage) {
        // VBox 為排版需要的視窗元件
        VBox root = new VBox();
        
        // Label 為視窗元件
        Label display = new Label();
        display.setText("你好");
        
        // Button 為視窗元件
        Button click_button = new Button();
        click_button.setText("按我");
        click_button.setOnAction(new EventHandler<ActionEvent>() {
            
            // 以下為按下按鈕的執行方法
            @Override
            public void handle(ActionEvent event) {
                count += 1;
                if (count % 2 == 0) {
                    display.setText("你好");
                    click_button.setText("按我");
                }
                else {
                    display.setText("世界");
                    click_button.setText("再按");
                }   
            }
        });
        
        // 依序設定加入視窗元件、設定對齊及編距
        root.getChildren().add(click_button);
        root.getChildren().add(display);
        root.setAlignment(Pos.CENTER);
        VBox.setMargin(click_button, new Insets(10, 10, 10, 10));
        VBox.setMargin(display, new Insets(10, 10, 10, 10));
        
        // 設定視窗尺寸
        Scene scene = new Scene(root, 250, 250);
 
        // 設定標題及視窗
        primaryStage.setTitle("JavaFX Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

執行結果如下

繼續按按我按鈕

這個範例的程式碼可以由註解分成數個部分來看,除了按下按鈕後的事件方法外,其他有很多是關於設定 GUI 的相關程式碼,然後也只用到兩個視窗元件 LabelButton

更複雜、更大型的應用程式,如果都按照這樣的模式設計,維護起來會很麻煩,因此現代化應用程式設計的主流改採 MVC 分工的方式,這會是下一篇「JavaFX App 篇」開始介紹的主題。

相關教學影片

上一頁 單元 18 - 重構
回 Java 入門指南首頁
下一頁 JavaFX App 篇
回 Java 教材首頁
回程式語言教材首頁
中英文術語對照
類別class
解碼decoding
編碼encoding
索引值index
迴圈loop
巢狀迴圈nested loop
參數parameter
字串string
參考資料
1. Java™ Platform, Standard Edition 8 API Specification
2. The Java™ Tutorials: Trail: Creating a GUI With JFC/Swing
3. The Java™ Tutorials: Client Technologies
重點整理
1. Java API 是 Java 的類別庫,裡頭有各式各樣的應用。
2. Java API 中有三種開發 GUI 的程式庫,分別是 AWT 、 Swing 及 JavaFX 。
3. 本書會介紹 JavaFX , JavaFX 可以採用 FXML 的方式開發 GUI ,之後方便跟開發 Android App 接軌。
問題與討論
1. 為什麼 Java API 中有那麼多種開發 GUI 的程式庫?
2. 為什麼不建議採用全程式開發 GUI ?
練習
1. 承接上一個單元的猜數字遊戲,將新專案寫在 Exercise1901 中,將 mian() 中的 GuessScanner 物件提升為屬性,然後在建構子初始化這兩個屬性,在 main() 中建立 Exercise1901 型態的變數 game ,利用 game 進行遊戲部分。
2. 承上題,將新專案寫在 Exercise1902 中,把遊戲部分改到 run() 方法中,然後在 main() 裡建立 Exercise1902 型態的變數 game ,由 game 呼叫 run() 進行遊戲。