0

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. JDialog luô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).
  • Ứ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 JFrame chí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.

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí