Series Java Swing Bài 4: Sự khác biệt giữa JFrame, JDialog và JWindow
Trong Java Swing, JFrame, JDialog và JWindow được gọi là các Top-Level Containers (Vật chứa cấp cao nhất). Điểm chung duy nhất của chúng là có thể xuất hiện độc lập trên màn hình hệ điều hành mà không cần phải nhúng vào một Component nào khác. Tuy nhiên, mỗi loại được thiết kế với một kiến trúc và mục đích hoàn toàn khác biệt.
1. JFrame: Cửa sổ chính (Main Window)
- Đặc điểm: Sở hữu đầy đủ các thành phần của một cửa sổ hệ điều hành tiêu chuẩn, bao gồm thanh tiêu đề (Title bar), đường viền (Border), và các nút điều khiển (Thu nhỏ, Phóng to, Đóng).
- Ứng dụng: Làm cửa sổ gốc, giao diện chính của toàn bộ phần mềm (Ví dụ: Màn hình Dashboard, Màn hình Quản lý chính).
- Vòng đời: Thường được thiết lập
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)để khi đóng cửa sổ này, toàn bộ chương trình sẽ kết thúc và giải phóng tài nguyên hệ thống.
2. JDialog: Hộp thoại phụ (Secondary Window / Pop-up)
- Đặc điểm: Có thanh tiêu đề và viền, nhưng thường chỉ có nút Đóng (
X), không có nút Thu nhỏ/Phóng to.JDialogluôn phụ thuộc vào một cửa sổ cha (thường làJFrame). - Khái niệm cốt lõi - Modality (Tính độc quyền): Đây là sức mạnh lớn nhất của
JDialog.- Modal Dialog (
setModal(true)): Bắt buộc người dùng phải xử lý và đóng hộp thoại này thì mới có thể thao tác tiếp với cửa sổ chính. Giao diện chính phía sau sẽ bị "khóa". (Ví dụ: Hộp thoại xác nhận xóa dữ liệu, Form đăng nhập). - Modeless Dialog (
setModal(false)): Cho phép người dùng vừa mở hộp thoại, vừa click và tương tác song song với cửa sổ chính. (Ví dụ: Cửa sổ Find & Replace trong Notepad hay MS Word).
- Modal Dialog (
- Ứng dụng: Các form nhập liệu phụ, màn hình cấu hình cài đặt (Settings), hoặc cảnh báo.
- Vòng đời: Thường dùng
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)để tiêu hủy đối tượng và giải phóng bộ nhớ khi tắt, nhưng không làm tắt toàn bộ phần mềm.
3. JWindow: Khung hình trần (Barebones Window)
- Đặc điểm: Là một cửa sổ "trần trụi" đúng nghĩa. Không có thanh tiêu đề, không có viền, không có các nút điều khiển, và không thể di chuyển bằng cách kéo thả chuột theo cách thông thường.
- Ứng dụng:
- Splash Screen: Màn hình chào hiển thị logo và thanh tiến trình khởi động tải dữ liệu khi vừa mở ứng dụng (hiển thị trước khi
JFramechính load xong). - Custom Tooltip hoặc các menu thả xuống (Dropdown) có giao diện tùy chỉnh phức tạp.
- Splash Screen: Màn hình chào hiển thị logo và thanh tiến trình khởi động tải dữ liệu khi vừa mở ứng dụng (hiển thị trước khi
4. Bảng so sánh tổng quan
| Tiêu chí | JFrame | JDialog | JWindow |
|---|---|---|---|
| Thanh tiêu đề (Title Bar) | Có | Có | Không |
| Nút điều khiển (Min/Max/Close) | Đầy đủ | Thường chỉ có nút Close | Không có |
| Tính độc quyền (Modality) | Không | Có (Modal hoặc Modeless) | Không |
| Phụ thuộc cửa sổ cha | Hoạt động độc lập | Cần một cửa sổ cha (Frame hoặc Dialog) | Có thể có hoặc không |
| Vai trò | Khung giao diện chính | Hộp thoại thao tác phụ | Màn hình khởi động, Tooltip |
5. Cấu trúc code minh họa Modal JDialog
Khác với JFrame, khi khởi tạo JDialog, bạn nên truyền vào tham chiếu của cửa sổ cha (parentFrame) và tham số modal (true/false) để hệ thống biết nó sẽ khóa tương tác của cửa sổ nào.
// Khởi tạo một cửa sổ chính frame (JFrame)
JFrame mainFrame = new JFrame("Cửa sổ chính");
mainFrame.setSize(500, 400);
mainFrame.setVisible(true);
// Tạo JDialog phụ thuộc vào mainFrame, set modal = true
JDialog dialog = new JDialog(mainFrame, "Xác nhận thao tác", true);
dialog.setSize(300, 150);
dialog.setLocationRelativeTo(mainFrame); // Canh giữa chính xác so với cửa sổ cha
dialog.setLayout(new FlowLayout());
dialog.add(new JLabel("Bạn có chắc chắn muốn tiếp tục?"));
JButton btnOK = new JButton("OK");
btnOK.addActionListener(e -> dialog.dispose()); // Đóng Dialog khi bấm nút
dialog.add(btnOK);
// Kỹ thuật quan trọng: Vì modal = true, luồng code (Thread) tại đây sẽ bị TẠM DỪNG.
// Các dòng code phía dưới setVisible(true) chỉ được thực thi SAU KHI dialog bị đóng.
dialog.setVisible(true);
System.out.println("Hộp thoại đã đóng, tiếp tục chạy logic...");
All rights reserved