首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

《Thinking in Java》第 14 章閱讀筆記:Swing GUI 程式設計核心概念

     編輯:Java 相關知識

前言

本章介紹 Java 2 Swing 元件庫,核心哲學:「簡單任務輕鬆完成,複雜任務也有解決之道」。重點涵蓋 Applet/Application 雙模式、事件模型、佈局管理、可插拔外觀、JavaBeans 元件架構與多執行緒安全。

一、Applet 基礎與限制

1.1 沙箱模型

  • Applet 運行於瀏覽器 JVM,受 SecurityManager 嚴格限制:無本地檔案/網路/系統資源存取權。
  • 數位簽名 JAR 可提權(用戶信任後),但簽名驗證流程複雜。
  • 啟動緩慢:每次下載所有類別,建議打包為單一 JAR 減少 HTTP 請求。

1.2 Applet 生命週期方法

方法觸發時機用途
init()Applet 載入初始化建立 UI 元件、載入資源(必須覆寫)
start()頁面顯示/恢復啟動動畫/執行緒
stop()頁面隱藏/離開暫停耗資源操作
destroy()瀏覽器卸載 Applet釋放資源、關閉連線

關鍵差異:Swing Applet 需將元件加入 getContentPane(),而非直接 add()。

1.3 部署標籤演進

  • 早期 <applet> 標籤簡單但瀏覽器支援不一。
  • 後期採用 <object> (IE/ActiveX) + <embed> (Netscape/Plugin) 雙標籤,JDK 提供 HTMLConverter 自動轉換。

二、JNLP / Java Web Start

  • 解決 Applet 侷限於瀏覽器、UI 混雜、啟動慢等問題。
  • 透過 .jnlp XML 描述檔:指定 JAR、主類別、J2SE 版本、權限、資源下載策略。
  • security 元素配合簽名 JAR 實現完全信任;未簽名可透過 FileOpenService 等 JNLP API 受限存取本地資源(需用戶運行時授權)。
  • 部署只需 Web 伺服器識別 application/x-java-jnlp-file MIME 類型。

三、Swing 程式設計核心技巧

3.1 動態事件綁定

  • addXxxListener() / removeXxxListener() 運行時動態增減監聽器。
  • 支援多播:單一事件可註冊多個 Listener(少數單播元件除外)。
  • 調用順序不保證等於註冊順序(雖多數 JVM 如此實作)。

3.2 業務邏輯與 UI 分離

「將『做什麼』與『怎麼顯示』解耦,業務物件不依賴特定顯示技術,支援多層架構與邏輯複用。」

  • Controller/Action 僅處理流程控制與錯誤處理。
  • Business Object (POJO/EJB) 專注領域邏輯,無 UI 依賴。
  • 維護舊系統時此原則同樣適用。

3.3 事件處理範式:內部類 Listener

  • 採用 addActionListener(new ActionListener() { ... }) 匿名內部類。
  • 優點:自動捕獲外部類最終變數、程式碼內聚、避免大量 if (e.getSource() == btn) 型別檢查。
  • 可讀性、可維護性最高,為推薦標準風格。

3.4 併發與 Swing 事件分派執行緒 (EDT)

  • Swing 非執行緒安全,所有 UI 更新必須在 EDT 執行。
  • 長時間任務放入背景執行緒,完成後用 SwingUtilities.invokeLater() 或 invokeAndWait() 回傳 EDT 更新 UI。
  • 違反會導致死鎖、畫面凍結、資料不一致等難以重現的 Bug。

四、可視化編程與 JavaBeans

4.1 元件模型三要素

  1. 屬性:getXxx()/setXxx() 命名慣例(boolean 可用 isXxx()),設計時可修改,運行時持久化。
  2. 事件:addXxxListener(XxxListener)/removeXxxListener(),標準監聽器模式。
  3. 方法:公共業務方法,無特殊命名限制。

4.2 Introspector 自動發現

建構工具透過 Introspector.getBeanInfo(Class) 反射分析類別,自動建立屬性表/事件列表,無需特殊關鍵字或介面——純粹約定優於配置。

4.3 進階 Bean 功能

  • 索引屬性:getXxx(int index)/setXxx(int index, Type) 陣列式屬性。
  • 綁定屬性:屬性變更觸發 PropertyChangeEvent 通知監聽器。
  • 約束屬性:變更前觸發 VetoableChangeListener,可拋 PropertyVetoException 否決。
  • 自定義 BeanInfo:覆寫預設內省結果,控制屬性/事件顯示順序、編輯器、專家模式等。

4.4 Bean 封裝與部署

  • 建立 MANIFEST.MF:Java-Bean: True 標記類別為 Bean。
  • 打包 JAR:jar cfm Bean.jar manifest.mf package/,工具自動生成 META-INF/MANIFEST.MF 含簽名摘要。
  • 每個 Bean 獨立子目錄,便於 JAR 管理與版本控制。

4.5 Bean 執行緒安全

  • 原則:所有 public 方法預設 synchronized,除非證明為原子操作且效能敏感才移除。
  • 多播事件發送時需複製監聽器陣列避免並發修改異常。
  • paintComponent() 通常不加同步,效能優先;若讀寫共享關鍵狀態則需評估加鎖。

五、總結與心得

  • Swing 以正交設計、輕量級跨平台、豐富元件、可插拔外觀確立 Java GUI 標準。
  • JavaBeans 以簡單命名慣例實現極致易用的元件模型,支援視覺化建構工具。
  • EDT 併發模型是 Swing 開發者必須內化的核心約束。
  • TIJ 第 14 章為 Swing 入門最佳教材之一,建議配合 JDK 文檔與專書深入研讀。

「感謝 Bruce Eckel 無私開源經典巨著,譯者 shhgs 讓英語盲也能零距離研讀。前輩風範,晚輩楷模。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved