前言
為了應對JAVA課設,小編走上了java的圖形界面編程的道路,通過博客分享自己的學習歷程,并進行筆記的記錄。
AWT(Abstract Window Toolkit)介紹
AWT(抽象窗口工具包)是 Java 最早的圖形用戶界面(GUI)框架之一,主要用于構建桌面應用程序的圖形界面。最初在 JDK 1.0 版本中作為 Java GUI 的核心庫引入,旨在提供一個跨平臺的圖形用戶界面工具包。
AWT 的最大特點是 平臺依賴性,即它依賴于底層操作系統的窗口系統來創建和渲染界面組件。由于這一點,AWT 的組件在不同操作系統上可能表現出不同的外觀和行為。
后續我們將介紹基于純JAVA實現的swing、
盡管如此,AWT 仍然是 Java 圖形界面編程的重要部分,尤其是在較老的 Java 應用程序中。
AWT 主要特性
-
基于操作系統的原生組件: AWT 中的組件是 重量級組件(heavyweight components),即它們直接依賴于底層操作系統的窗口系統(如 Windows 或 X11)。這導致 AWT 的外觀和行為通常會隨平臺的不同而有所不同。
-
事件驅動模型: AWT 使用事件驅動編程模型來響應用戶的輸入。開發者通過事件監聽器處理鼠標、鍵盤等輸入事件。這一機制使得 AWT 能夠提供交互式的界面。
-
跨平臺: AWT 提供了跨平臺的圖形界面組件,但由于它依賴于底層操作系統的窗口組件,所以它的表現和外觀會受到操作系統的影響。
-
簡單的布局管理器: AWT 提供了多種布局管理器(如
FlowLayout
、BorderLayout
和GridLayout
),用于幫助開發者控制組件在容器中的布局。 -
低級圖形支持: AWT 提供了對基本圖形(如線條、矩形、圓形、文本)的支持,開發者可以在窗口中繪制簡單的圖形。
AWT 繼承體系
AWT 的繼承體系可以從幾個核心類開始理解,主要的類包括 Component
、Container
、Window
等,這些類通過繼承關系形成了 AWT 組件的層次結構。
AWT 繼承體系結構圖
Object|java.awt.Component/ | \java.awt.Container java.awt.Window|java.awt.Frame|java.awt.Panel
1. Object
- 所有 Java 類的祖先類。
2. java.awt.Component
Component
是 AWT 類庫中所有圖形組件的基類,幾乎所有的圖形組件(如按鈕、文本框、標簽等)都直接或間接地繼承自Component
類。Component
類提供了處理圖形組件的位置、大小、繪制、事件等功能。- 關鍵方法:
setSize(int width, int height)
:設置組件的大小。setLocation(int x, int y)
:設置組件的位置。paint(Graphics g)
:重繪組件的方法,通常用于自定義組件的外觀。addActionListener(ActionListener listener)
:添加事件監聽器。
3. java.awt.Container
Container
類是Component
的子類,表示可以包含其他組件的容器。它本身不能單獨顯示,但可以用來容納其他組件(如Button
、Label
等)。容器本身不直接顯示內容,而是管理其他組件的布局。- 容器類主要用于管理和顯示多個子組件。
- 關鍵方法:
add(Component comp)
:將組件添加到容器中。setLayout(LayoutManager mgr)
:設置容器的布局管理器。
- 常見的容器類:
Frame
:代表一個應用程序的主窗口,通常包含標題欄和菜單欄。Panel
:面板,允許將多個組件組合成一個區域。Dialog
:對話框,通常用于顯示消息或獲取用戶輸入。ScrollPane
:具有滾動條的容器。
4. java.awt.Window
Window
類是Component
的直接子類,它表示一個頂級窗口或對話框。在 AWT 中,所有的頂級窗口(如Frame
、Dialog
)都繼承自Window
類。- 關鍵方法:
setVisible(boolean b)
:控制窗口的可見性。setSize(int width, int height)
:設置窗口的大小。setLocation(int x, int y)
:設置窗口的位置。
- 常見的
Window
類子類:Frame
:代表一個具有邊框和標題的主窗口。Dialog
:代表一個彈出式對話框窗口。
5. java.awt.Frame
Frame
是Window
類的一個子類,表示一個具有邊框和標題欄的窗口。它通常是一個應用程序的主窗口。Frame
類提供了用于管理應用窗口的各種功能,如關閉窗口、設置大小、設置菜單等。- 關鍵方法:
setTitle(String title)
:設置窗口的標題。setMenuBar(MenuBar mb)
:設置窗口的菜單欄。addWindowListener(WindowListener listener)
:添加窗口事件監聽器。
6. java.awt.Panel
Panel
是Container
的一個子類,表示一個沒有邊框的面板,通常用于容納多個組件。面板常用于組織窗口中的布局和設計。- 它允許對組件進行布局,并且是一個容器,通常用于構建更復雜的用戶界面。
- 關鍵方法:
setLayout(LayoutManager mgr)
:設置面板的布局管理器。
AWT 組件的繼承體系總結
- 所有 AWT 組件最終都繼承自
java.awt.Component
。 - 容器 是繼承自
Container
類的,容器負責管理和布局其中的組件。 - 頂級窗口(如
Frame
、Dialog
)繼承自Window
類,它們都是Component
的直接或間接子類。 - 通過繼承關系,開發者可以自定義自己的 GUI 組件,繼承
Component
或Container
類,并在其中實現自定義的繪制或布局功能。
AWT 組件
AWT 包括多種用于構建 GUI 的組件(如按鈕、文本框、標簽等)。這些組件在 AWT 中都是類的實例,通常需要添加到容器(如 Frame
或 Panel
)中。
1. 頂級容器
- Frame:代表應用程序的主窗口。一個應用程序通常只有一個
Frame
。 - Dialog:表示一個對話框窗口,用于顯示提示或接受用戶輸入。
- FileDialog:用于文件選擇的對話框。
- Window:一個頂級窗口的類,可以用于創建無邊框的窗口。
2. 組件
- Button:按鈕組件。
- Label:標簽組件,用于顯示文本。
- TextField:文本輸入框,用于單行文本輸入。
- TextArea:文本區域,用于多行文本輸入。
- CheckBox:復選框,用于選擇項。
- RadioButton:單選按鈕,用于在多個選項中選擇一個。
- List:列表組件,用于顯示項目的列表。
- Choice:下拉列表框。
- Scrollbar:滾動條組件。
- Menu 和 MenuItem:菜單及菜單項組件。
3. 布局管理器
- FlowLayout:組件按順序排列,默認從左到右排列。
- BorderLayout:將容器分為五個區域:北(NORTH)、南(SOUTH)、東(EAST)、西(WEST)、中(CENTER)。
- GridLayout:以網格的方式排列組件,所有單元格大小相同。
- CardLayout:類似卡片的布局,允許容器中顯示一個組件的“卡片”。
- GridBagLayout:更靈活的網格布局,可以調整組件的大小和位置。
4. 事件模型
- ActionListener:響應按鈕、菜單等可觸發動作的組件。
- MouseListener:響應鼠標事件。
- KeyListener:響應鍵盤事件。
- WindowListener:響應窗口的打開、關閉、激活等事件。
- ItemListener:響應復選框、單選按鈕等的狀態改變。
一個簡單的程序
import java.awt.*;
import java.awt.event.*;public class SimpleAWTApp {public static void main(String[] args) {// 創建一個 Frame 對象Frame frame = new Frame("AWT 示例");// 創建按鈕并設置點擊事件Button button = new Button("點擊我");button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.out.println("按鈕被點擊");}});// 創建文本框TextField textField = new TextField("請輸入文本");// 設置布局管理器為 FlowLayoutframe.setLayout(new FlowLayout());// 將組件添加到 frame 中frame.add(button);frame.add(textField);// 設置 frame 大小frame.setSize(300, 200);// 設置關閉操作frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});// 顯示 frameframe.setVisible(true);}
}
結束語
下節開始我們將對相關組件進行介紹!!!