Series Java Swing Bài 1: Tổng quan kiến trúc Java Swing và sự khác biệt với AWT.
Java Swing là bộ thư viện giao diện người dùng đồ họa (GUI) chính thức của Java, thuộc nền tảng Java Foundation Classes (JFC). Để hiểu bản chất kiến trúc của Swing, bạn cần biết nó sinh ra để giải quyết vấn đề gì từ người tiền nhiệm của nó: AWT.
1. Bản Chất Sự Khác Biệt: Heavyweight (AWT) vs. Lightweight (Swing)
Thời kỳ đầu, Java cung cấp thư viện AWT (Abstract Window Toolkit) để làm giao diện.
- AWT sử dụng kiến trúc Heavyweight (Hạng nặng): Khi bạn tạo một nút bấm (Button) bằng AWT, Java sẽ "nhờ vả" hệ điều hành (Windows, macOS, Linux) vẽ cái nút đó ra.
- Hệ quả: Nút bấm trên Windows sẽ có giao diện của Windows, trên macOS mang giao diện của Mac. Nếu hệ điều hành không hỗ trợ một tính năng nào đó, AWT cũng không thể hiển thị được.
- Java Swing ra đời với kiến trúc Lightweight (Hạng nhẹ): Swing hoàn toàn được viết bằng mã Java nguyên bản. Thay vì nhờ hệ điều hành vẽ từng thành phần, Swing chỉ mượn hệ điều hành một khung cửa sổ trống, sau đó tự tay vẽ các nút bấm, ô nhập liệu lên đó thông qua API đồ họa của Java (Java 2D).
Bảng so sánh nhanh AWT và Java Swing:
| Tiêu chí | AWT (Abstract Window Toolkit) | Java Swing |
|---|---|---|
| Kiến trúc | Heavyweight (Phụ thuộc vào hệ điều hành) | Lightweight (Độc lập hệ điều hành) |
| Độ đồng nhất | Giao diện thay đổi theo từng hệ điều hành | Hiển thị nhất quán trên mọi hệ điều hành |
| Tùy biến | Khó tùy biến, số lượng Component rất nghèo nàn | Dễ dàng tùy biến, kho Component cực kỳ đồ sộ |
| Hiệu năng | Nhanh hơn (do hệ điều hành trực tiếp xử lý) | Chậm hơn một chút (do Java phải tự render đồ họa) |
| Nhận diện Code | Dùng các class cơ bản: Button, Label, Frame |
Luôn bắt đầu bằng chữ "J": JButton, JLabel, JFrame |
2. Hai Trụ Cột Kiến Trúc Của Java Swing
Bên dưới lớp vỏ giao diện, Swing được thiết kế dựa trên hai tư tưởng lớn:
A. Mô hình Modified MVC (Model - View - Controller)
Swing áp dụng kiến trúc MVC để tách biệt dữ liệu và giao diện, nhưng được tinh chỉnh lại thành kiến trúc Model - Delegate:
- Model: Quản lý dữ liệu và trạng thái (Ví dụ:
TableModelchứa mảng dữ liệu của bảng). - UI Delegate (View + Controller): Chịu trách nhiệm vẽ giao diện lên màn hình và xử lý các sự kiện click, gõ phím trực tiếp trên Component đó.
- Lợi ích: Bạn có thể thay đổi dữ liệu ở Model, và View sẽ tự động cập nhật mà không cần viết code vẽ lại giao diện.
B. Pluggable Look and Feel (PLAF)
Vì Swing tự vẽ giao diện, nó cho phép bạn thay đổi toàn bộ "lớp áo" (theme) của ứng dụng chỉ bằng một dòng code tại thời điểm Runtime. Bạn có thể làm app của mình trông giống Windows, giống Mac, hoặc khoác lên các giao diện Dark Mode hiện đại (như FlatLaf) mà không phải sửa lại logic code.
3. Mã Nguồn So Sánh Nhanh
Sự khác biệt trong cú pháp khởi tạo giữa hai thư viện:
// Khởi tạo bằng AWT (Không khuyến khích)
import java.awt.*;
Frame awtFrame = new Frame("Đây là AWT");
Button awtButton = new Button("Click me");
awtFrame.add(awtButton);
// Khởi tạo bằng Java Swing (Tiêu chuẩn hiện tại)
import javax.swing.*;
JFrame swingFrame = new JFrame("Đây là Java Swing");
JButton swingButton = new JButton("Click me");
swingFrame.add(swingButton);
⚠️ Lưu ý quan trọng: Không bao giờ trộn lẫn Component của AWT (không có chữ J) và Swing (có chữ J) trong cùng một cửa sổ. Việc trộn lẫn hai loại kiến trúc vẽ đồ họa khác nhau này (Z-Order mixing) sẽ gây ra lỗi hiển thị, các thành phần đè lên nhau hoặc nhấp nháy liên tục.
All rights reserved