Applet 受沙箱嚴格限制:
真實世界應用需要:完整檔案存取、原生選單/對話框、資料庫直連、長期執行、系統整合 (系統匣、檔案關聯、啟動參數)。
| 時代 | 技術 | 特點 |
|---|---|---|
| Java 1.0/1.1 | AWT | 重量級元件、平台外觀不一、功能有限 |
| Java 2 (1.2+) | Swing (JFC) | 輕量級元件、可換膚、豐富元件 (JTable, JTree...)、MVC 架構 |
| Java 8+ | JavaFX | 現代 GPU 加速渲染、FXML/CSS 分離、屬性綁定、WebView、3D、動畫 |
| 現代 | Spring Boot + JavaFX / Electron / Flutter / Tauri | 模組化、微服務整合、跨平台桌面新選擇 |
public class MyApp extends Frame {
public MyApp() {
setTitle("My Application");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
// 初始化 UI 元件...
}
public static void main(String[] args) {
Frame f = new MyApp();
f.setSize(400, 300);
f.setVisible(true);
}
}
public class SwingApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Swing App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 建構 UI...
frame.pack();
frame.setLocationRelativeTo(null); // 置中
frame.setVisible(true);
});
}
}
public class FxApp extends Application {
@Override public void start(Stage stage) {
stage.setTitle("JavaFX App");
// FXML 載入或程式碼建構場景
stage.setScene(new Scene(root, 800, 600));
stage.show();
}
public static void main(String[] args) { launch(args); }
}
SwingWorker/Task 背景執行。jlink 打包精簡 JRE,jpackage 產出原生安裝包 (exe, dmg, deb, msi)。Desktop API (開啟檔案/郵件/瀏覽器)、SystemTray、SplashScreen、檔案關聯註冊。SwingUtilities.invokeLater/Platform.runLater。pack() vs setSize():pack() 依偏好大小自動調整,尊重元件最小/偏好尺寸。從 AWT 的 Frame 到 JavaFX 的 Stage,Java 桌面開發核心挑戰始終是:執行緒安全、原生整合、部署分發、UI 響應性。選擇 Swing 成熟穩定、生態豐富;選擇 JavaFX 現代架構、長期演進;選擇跨平台框架 (Electron, Tauri) 則以 Web 技術棧換取開發效率。無論技術棧,關注點分離 (MVC/MVVM)、依賴注入、模組化 才是打造可維護桌面應用的不二法門。