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

Java AWT 圖形界面開發:框架、容器與視窗建立完整教學

     編輯:Java 綜合教學

Java AWT 圖形界面開發:框架、容器與視窗建立完整教學

AWT(Abstract Window Toolkit)是 Java 早期提供的 GUI 開發工具包,雖然 Swing/JavaFX 更現代,但理解 AWT 架構有助於掌握 Java GUI 核心概念。本文系統講解 AWT 類別體系、Frame/Panel 容器使用、視窗建立與佈局管理實戰。

Java GUI 技術體系概覽

JFC (Java Foundation Classes) 包含三大支柱:

組件描述關係
AWT抽象視窗工具包,原生對等體,輕量級前身JFC 基礎
Swing建立在 AWT 之上,純 Java 實現,功能豐富、可換膚主流選擇
Java 2D高品質 2D 圖形、文字、圖像渲染 API繪圖增強

AWT 核心類別架構

AWT 類別架構圖

  • Component:所有 GUI 組件根類,提供繪圖、事件處理、尺寸/位置管理
  • Container 繼承 Component:可包含其他組件,擁有佈局管理器
  • Window:頂層視窗,無邊框/標題欄,獨立存在
  • Frame 繼承 Window:標準應用視窗,有標題欄、邊框、最小化/最大化/關閉按鈕
  • Panel 繼承 Container:中間容器,必須放入 Window/Frame 才可顯示

Frame 容器詳解

核心特性

  • 構造方法:Frame()、Frame(String title)
  • 預設佈局管理器:BorderLayout
  • 新建後不可見,需調用 setVisible(true)
  • 支援 add(Component) 添加子組件

基本視窗範例

import java.awt.*;

class MyFrame extends Frame {
    public MyFrame(String title) {
        super(title);
    }
    
    public void init() {
        this.setSize(300, 300);           // 設定寬高
        this.setBackground(Color.GREEN);  // 背景色
        this.setVisible(true);            // 顯示視窗
    }
}

public class TestFrame {
    public static void main(String[] args) {
        MyFrame frame = new MyFrame("我的第一個 AWT 視窗");
        frame.init();
    }
}

基本視窗截圖

Panel 容器與巢狀佈局

Panel 特性

  • 非頂層容器,需加入 Frame/Window 才可見
  • 預設佈局:FlowLayout
  • 支援巢狀:Container 可加入 Container,構建複雜佈局

帶 Panel 與 Button 的完整範例

import java.awt.*;

class MyFrameWithPanel extends Frame {
    public MyFrameWithPanel(String title) {
        super(title);
    }
    
    public void init() {
        this.setSize(300, 300);
        this.setBackground(Color.GREEN);
        this.setLayout(null); // 取消預設 BorderLayout,使用絕對定位
        
        // 建立面板
        Panel panel = new Panel();
        panel.setLayout(null);      // 面板也使用絕對定位
        panel.setBackground(Color.BLUE);
        panel.setBounds(0, 0, 200, 200); // 相對父容器 Frame 位置
        
        // 建立按鈕
        Button btn = new Button("Click Me");
        btn.setBounds(0, 0, 100, 100);   // 相對 Panel 位置
        btn.setBackground(Color.RED);
        
        // 組裝層級:Frame → Panel → Button
        panel.add(btn);
        this.add(panel);
        
        this.setVisible(true);
    }
}

public class TestPanel {
    public static void main(String[] args) {
        new MyFrameWithPanel("Panel 嵌套範例").init();
    }
}

Panel 嵌套截圖

佈局管理器核心對比

管理器特點適用場景
FlowLayout左到右、上到下流式排列,Panel 預設簡單按鈕組、工具列
BorderLayout東南西北中五區域,Frame 預設主視窗整體佈局
GridLayout規則網格,行列固定計算機鍵盤、表格
GridBagLayout彈性網格,組件可跨行列、權重分配複雜表單、響應式佈局
CardLayout卡片堆疊,一次顯示一張嚮導頁、標籤頁切換
null (絕對定位)手動 setBounds(x,y,w,h),不自動調整原型快速開發、固定尺寸視窗

事件處理機制

委派事件模型 (JDK 1.1+)

  • 事件源:產生事件的組件(Button、TextField 等)
  • 事件物件:封裝事件資訊(ActionEvent、MouseEvent 等)
  • 監聽器:實現特定介面處理事件(ActionListener、MouseListener)
  • 註冊:source.addActionListener(listener)

按鈕點擊事件範例

import java.awt.*;
import java.awt.event.*;

class EventFrame extends Frame implements ActionListener {
    Button btn;
    Label label;
    int count = 0;
    
    public EventFrame() {
        super("事件處理範例");
        setLayout(new FlowLayout());
        setSize(300, 200);
        
        btn = new Button("計數器: 0");
        label = new Label("點擊按鈕增加計數");
        
        btn.addActionListener(this); // 註冊監聽器
        
        add(label);
        add(btn);
        setVisible(true);
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        count++;
        btn.setLabel("計數器: " + count);
    }
    
    public static void main(String[] args) {
        new EventFrame();
    }
}

AWT 繪圖基礎

class DrawCanvas extends Canvas {
    @Override
    public void paint(Graphics g) {
        // 繪製圖形
        g.setColor(Color.RED);
        g.drawRect(10, 10, 100, 50);      // 矩形邊框
        g.fillOval(120, 10, 50, 50);      // 填充圓形
        g.drawLine(10, 80, 200, 80);      // 直線
        
        // 繪製文字
        g.setFont(new Font("微軟正黑體", Font.BOLD, 16));
        g.drawString("AWT 繪圖測試", 10, 150);
    }
}

// 在 Frame 中使用
Frame f = new Frame("繪圖");
f.add(new DrawCanvas());
f.setSize(300, 200);
f.setVisible(true);

視窗關閉處理

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0); // 或執行清理邏輯
    }
});

從 AWT 遷移到 Swing 的關鍵差異

總結

  • AWT 是 Java GUI 基石,理解 Component/Container/Window/Frame/Panel 階層關係至關重要
  • Frame 為頂層視窗,Panel 為中間容器,透過巢狀構建複雜介面
  • 佈局管理器自動處理組件定位,null 佈局僅供原型開發
  • 事件處理採用委派模型:事件源 + 事件物件 + 監聽器
  • 實際專案建議直接使用 Swing 或 JavaFX,但 AWT 核心概念完全通用

掌握 AWT 基礎,為深入學習 Swing、JavaFX 乃至 Android UI 開發打下堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性AWTSwing
實現方式原生對等體純 Java 輕量級
外觀一致性平台相關跨平台一致(可換膚)
組件豐富度基礎極豐富 (JTable, JTree, JTabbedPane...)
類別命名Button, FrameJButton, JFrame
雙重緩衝手動內建支援