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

Swing 與 AWT Applet 核心差異解析:從 Applet 到 JApplet 的架構進化

     編輯:Java 相關知識

Java GUI 開發從 AWT 進化到 Swing,Applet 到 JApplet 的遷移不僅是類名變更,更是容器架構、佈局管理、組件模型的根本重構。本文通過對比原始碼級差異,揭示 JApplet 引入 ContentPane、RootPane、GlassPane 分層架構的設計意圖,助力開發者平滑遷移並發揮 Swing 豐富組件優勢。

核心架構對比

特性AWT AppletSwing JApplet影響
繼承類java.applet.Appletjavax.swing.JAppletSwing 組件層次根節點
默認佈局FlowLayout (左對齊)BorderLayout (居中)視覺呈現默認行為改變
容器結構單層容器JRootPane → ContentPane/GlassPane/LayeredPane支持分層、彈出菜單、模態對話框
組件添加applet.add(component)contentPane.add(component)強制分離內容與裝飾層
菜單欄支持不支持setJMenuBar()Applet 也能擁有頂級菜單
雙重緩衝手動實現內建 RepaintManager消除閃爍,渲染性能提升

代碼遷移實戰對比

AWT Applet 寫法(舊)


import java.applet.Applet;
import java.awt.*;

public class OldApplet extends Applet {
    public void init() {
        // 默認 FlowLayout,組件靠左排列
        Label label = new Label("AWT Applet");
        add(label); // 直接添加到 Applet 容器
    }
}

Swing JApplet 寫法(新)


import javax.swing.*;
import java.awt.*;

public class NewApplet extends JApplet {
    public void init() {
        // 1. 獲取內容面板(關鍵差異)
        Container contentPane = getContentPane();
        // contentPane 默認 BorderLayout,組件居中顯示
        
        // 2. 使用 Swing 組件(J 前綴)
        Icon icon = new ImageIcon("swing.gif", "A GIF on Swing");
        JLabel label = new JLabel("Swing!", icon, SwingConstants.CENTER);
        
        // 3. 添加到內容面板而非 Applet 本身
        contentPane.add(label, BorderLayout.CENTER); // 可省略,默認即 CENTER
        
        // 4. 可選:設置菜單欄
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(new JMenu("File"));
        setJMenuBar(menuBar);
    }
}

JRootPane 分層架構深度解析

JApplet 唯一子組件是 JRootPane,它包含四層結構:


JApplet
 └── JRootPane (唯一子組件)
      ├── GlassPane (最上層,透明,攔截事件、繪製覆蓋層)
      ├── LayeredPane (分層面板,管理菜單彈出、工具提示、內部框架 Z 序)
      │    └── ContentPane (內容面板,實際業務組件容器,默認 BorderLayout)
      └── MenuBar (菜單欄,可選,通過 setJMenuBar 設置)

關鍵規則

  1. 所有業務組件必須加入 ContentPane:`getContentPane().add(component)`
  2. 不應直接設置 JApplet 佈局管理器:應設置 `contentPane.setLayout()`
  3. GlassPane 用途:模態對話框遮罩、拖拽反饋、全局事件攔截
  4. LayeredPane 用途:JInternalFrame、JPopupMenu、ToolTip 等懸浮元素分層

常見遷移陷阱與解決方案

問題現象原因解決方案
組件不顯示/位置錯誤仍用 `applet.add()` 而非 `contentPane.add()`全局替換 `add(` → `getContentPane().add(`
佈局失效對 JApplet 調用 `setLayout()`改為 `getContentPane().setLayout()`
菜單不顯示用 AWT MenuBar改用 `JMenuBar` + `setJMenuBar()`
閃爍嚴重未啟用雙重緩衝Swing 默認開啟,檢查是否重寫 `paint()` 破壞機制
事件無響應GlassPane 攔截事件檢查 GlassPane 設置,通常保持默認不可見即可

Swing 組件優勢速覽

  • 豐富組件庫:JTable、JTree、JTabbedPane、JColorChooser、JFileChooser 等 AWT 無對應組件
  • 可換膚架構:UIManager + LookAndFeel 實現 Metal/Nimbus/Windows/Mac 原生外觀切換
  • MVC 分離:Model(數據) / UIDelegate(渲染/交互) 分離,支持共享模型、自定義渲染器
  • 無障礙支持:AccessibleContext 內建螢幕閱讀器支持
  • 國際化就緒:組件文本、工具提示天然支持 ResourceBundle

遷移檢查清單

  1. [ ] 繼承類改為 `JApplet`
  2. [ ] 所有 `add(component)` → `getContentPane().add(component)`
  3. [ ] 所有 `setLayout()` → `getContentPane().setLayout()`
  4. [ ] AWT 組件 → Swing 組件 (Label→JLabel, Button→JButton, TextField→JTextField...)
  5. [ ] 菜單改用 `JMenuBar`/`JMenu`/`JMenuItem` + `setJMenuBar()`
  6. [ ] 移除手動雙重緩衝代碼,信任 RepaintManager
  7. [ ] 測試跨平台外觀:`UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved