Series Java Swing Bài 24: JOptionPane - Làm chủ 4 loại hộp thoại thông báo, cảnh báo
Trong quá trình sử dụng phần mềm, bạn chắc chắn đã gặp những hộp thoại nhỏ bật lên giữa màn hình chặn bạn lại: "Lưu thành công", "Bạn có chắc chắn muốn xóa?", hoặc "Vui lòng nhập tên".
Thay vì phải tạo một cửa sổ JDialog (Bài 4) mới tinh từ con số 0, cặm cụi vẽ từng nút bấm và nhãn chữ, Swing cung cấp một lớp tiện ích "mì ăn liền" cực kỳ quyền lực mang tên JOptionPane. Nó cho phép bạn tạo ra các hộp thoại chuẩn mực (Modal dialog) chỉ bằng 1 dòng code duy nhất.
1. Tham số "Parent" và "Message Type" (Kiến thức nền)
Trước khi đi vào 4 loại hộp thoại, bạn cần hiểu 2 tham số xuất hiện ở hầu hết các hàm của JOptionPane:
-
parentComponent(Cửa sổ cha):-
Nếu bạn truyền
this(đại diện cho JFrame hiện tại): Hộp thoại sẽ khóa cửa sổ đó lại và xuất hiện ngay chính giữa cửa sổ. -
Nếu bạn truyền
null: Hộp thoại sẽ xuất hiện ở chính giữa màn hình máy tính.
-
-
messageType(Loại thông báo - Icon): Quyết định biểu tượng (Icon) và âm thanh hệ thống (tiếng Ting, Tút) khi hộp thoại bật lên.-
JOptionPane.INFORMATION_MESSAGE: Chữimàu xanh (Thông tin). -
JOptionPane.WARNING_MESSAGE: Dấu chấm than màu vàng (Cảnh báo). -
JOptionPane.ERROR_MESSAGE: DấuXmàu đỏ (Lỗi). -
JOptionPane.QUESTION_MESSAGE: Dấu hỏi chấm (Hỏi đáp). -
JOptionPane.PLAIN_MESSAGE: Không có icon.
-
2. Bốn loại hộp thoại cốt lõi
Loại 1: showMessageDialog (Thông báo 1 chiều)
Chỉ hiển thị thông tin và có duy nhất nút OK. Dùng để báo lỗi, báo thành công.
Java
// Cú pháp: showMessageDialog(parent, nội_dung, tiêu_đề, loại_icon)
JOptionPane.showMessageDialog(this,
"Lưu dữ liệu vào Database thành công!",
"Thông báo",
JOptionPane.INFORMATION_MESSAGE);
Loại 2: showConfirmDialog (Xác nhận hành động)
Hỏi người dùng và yêu cầu đưa ra quyết định (Yes/No/Cancel). Hàm này sẽ trả về một số nguyên (int) đại diện cho nút mà người dùng vừa bấm. Bạn phải dùng lệnh if để bắt kết quả này.
Java
int result = JOptionPane.showConfirmDialog(this,
"Hành động này không thể hoàn tác. Chắc chắn xóa?",
"Cảnh báo xóa",
JOptionPane.YES_NO_OPTION, // Yêu cầu chỉ hiện nút Yes và No
JOptionPane.WARNING_MESSAGE);
if (result == JOptionPane.YES_OPTION) {
System.out.println("Thực hiện lệnh DELETE trong SQL...");
} else {
System.out.println("Đã hủy thao tác xóa.");
}
Loại 3: showInputDialog (Nhập liệu siêu tốc)
Hiển thị một thông báo kèm theo một ô JTextField nhỏ để người dùng gõ chữ vào. Hàm trả về chuỗi String người dùng đã nhập, hoặc null nếu họ bấm nút Cancel.
Java
String name = JOptionPane.showInputDialog(this,
"Vui lòng nhập tên tài khoản mới:",
"Tạo tài khoản",
JOptionPane.QUESTION_MESSAGE);
if (name != null && !name.trim().isEmpty()) {
System.out.println("Tên mới là: " + name);
}
Loại 4: showOptionDialog (Tùy biến tối đa "Trùm cuối")
Nếu bạn không thích các nút mặc định tiếng Anh (Yes/No/Cancel), bạn có thể tự định nghĩa mảng các nút bấm của riêng mình (Ví dụ: "Lưu thay đổi", "Không lưu", "Hủy bỏ").
Java
// Mảng chứa tên các nút (hiển thị từ trái sang phải)
String[] options = {"Lưu thay đổi", "Không lưu", "Hủy bỏ"};
int choice = JOptionPane.showOptionDialog(this,
"Bạn có muốn lưu các thay đổi trước khi thoát không?", // Nội dung
"Xác nhận thoát", // Tiêu đề
JOptionPane.DEFAULT_OPTION, // Loại Option (Default để tự do xài mảng options)
JOptionPane.QUESTION_MESSAGE, // Icon
null, // Không dùng icon tự tạo (dùng mặc định)
options, // Mảng các nút bấm
options[0]); // Nút được tô sáng mặc định khi vừa mở lên (Lưu thay đổi)
// Xử lý kết quả dựa vào vị trí index (0, 1, 2)
if (choice == 0) {
System.out.println("Đang lưu...");
} else if (choice == 1) {
System.out.println("Thoát không lưu");
}
3. Source Code Thực Chiến: Bảng điều khiển JOptionPane
Đoạn code dưới đây tạo ra một giao diện với 4 nút bấm, mỗi nút sẽ kích hoạt một loại hộp thoại khác nhau để bạn tự mình trải nghiệm.
Java
import javax.swing.*;
import java.awt.*;
public class JOptionPaneDemo extends JFrame {
public JOptionPaneDemo() {
setTitle("Làm chủ JOptionPane");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Chia màn hình thành lưới 4 hàng, 1 cột
setLayout(new GridLayout(4, 1, 10, 10));
// ==========================================
// 1. NÚT THÔNG BÁO LỖI (Message)
// ==========================================
JButton btnMessage = new JButton("1. Hiện thông báo Lỗi (MessageDialog)");
btnMessage.addActionListener(e -> {
JOptionPane.showMessageDialog(this,
"Không thể kết nối đến Máy chủ cơ sở dữ liệu (Mã lỗi: 500)",
"Lỗi hệ thống nghiêm trọng",
JOptionPane.ERROR_MESSAGE);
});
// ==========================================
// 2. NÚT XÁC NHẬN (Confirm)
// ==========================================
JButton btnConfirm = new JButton("2. Xác nhận xóa (ConfirmDialog)");
btnConfirm.addActionListener(e -> {
int result = JOptionPane.showConfirmDialog(this,
"Tài liệu này sẽ bị xóa vĩnh viễn.\nBạn có tiếp tục không?",
"Xác nhận",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (result == JOptionPane.YES_OPTION) {
JOptionPane.showMessageDialog(this, "Đã xóa thành công!");
}
});
// ==========================================
// 3. NÚT NHẬP LIỆU (Input)
// ==========================================
JButton btnInput = new JButton("3. Cập nhật trạng thái (InputDialog)");
btnInput.addActionListener(e -> {
String input = JOptionPane.showInputDialog(this,
"Hôm nay bạn cảm thấy thế nào?",
"Cập nhật cảm nghĩ",
JOptionPane.QUESTION_MESSAGE);
if (input != null && !input.isEmpty()) {
// Hiển thị lại những gì người dùng vừa gõ bằng MessageDialog
JOptionPane.showMessageDialog(this, "Trạng thái mới: " + input);
}
});
// ==========================================
// 4. NÚT TÙY CHỈNH (Option)
// ==========================================
JButton btnOption = new JButton("4. Lưu file (OptionDialog)");
btnOption.addActionListener(e -> {
Object[] options = {"Ghi đè file", "Tạo file mới", "Hủy bỏ"};
int choice = JOptionPane.showOptionDialog(this,
"File 'baocao.pdf' đã tồn tại. Bạn muốn làm gì?",
"Xử lý trùng lặp",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[1]); // Mặc định tô sáng nút "Tạo file mới"
if (choice == 0) {
System.out.println("Hành động: Ghi đè");
} else if (choice == 1) {
System.out.println("Hành động: Tạo mới");
} else {
System.out.println("Đã hủy!");
}
});
// Thêm các nút vào JFrame
add(btnMessage);
add(btnConfirm);
add(btnInput);
add(btnOption);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new JOptionPaneDemo().setVisible(true));
}
}
All Rights Reserved