首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Swing JOptionPane 對話框完整使用指南:四大類型與參數詳解

     編輯:Java 程式設計入門

javax.swing.JOptionPane 提供標準化模態對話框,涵蓋確認、輸入、信息、選項四大類型,是桌面應用快速交互的首選工具。本文系統整理 API 分類、參數含義、實戰代碼模板與進階定製技巧。

四大對話框類型對比

類型靜態方法用途返回值
確認對話框showConfirmDialog是/否/取消決策int (YES/NO/CANCEL/OK/CLOSED_OPTION)
輸入對話框showInputDialog文本輸入/下拉選擇String 或 Object (用戊選項)
信息對話框showMessageDialog提示/警告/錯誤通知void
選項對話框showOptionDialog完全自定義按鈕組合int (按鈕索引 0-based)

核心參數詳解


// 完整參數列表 (以 showOptionDialog 為例)
public static int showOptionDialog(
    Component parentComponent,      // 父組件,null=居中螢幕
    Object message,                 // 顯示內容:String、Component、Icon、Object[]
    String title,                   // 標題欄文字
    int optionType,                 // 按鈕組合類型
    int messageType,                // 圖標類型
    Icon icon,                      // 自定義圖標 (覆蓋 messageType)
    Object[] options,               // 自定義按鈕文本/組件數組
    Object initialValue             // 默認聚焦按鈕
)

optionType (按鈕組合)

  • DEFAULT_OPTION:單「OK」按鈕
  • YES_NO_OPTION:「是/否」
  • YES_NO_CANCEL_OPTION:「是/否/取消」
  • OK_CANCEL_OPTION:「確定/取消」

messageType (圖標)

  • ERROR_MESSAGE:紅叉 ❌
  • INFORMATION_MESSAGE:藍 i ℹ️
  • WARNING_MESSAGE:黃 ⚠️
  • QUESTION_MESSAGE:藍 ? ❓
  • PLAIN_MESSAGE:無圖標

實戰代碼模板

1. 信息提示


JOptionPane.showMessageDialog(
    null,                           // 居中
    "操作成功完成!",               // 內容
    "成功",                         // 標題
    JOptionPane.INFORMATION_MESSAGE // 圖標
);

2. 確認刪除


int result = JOptionPane.showConfirmDialog(
    parentFrame,
    "確定要刪除選中的 3 條記錄嗎?\n此操作不可恢復。",
    "確認刪除",
    JOptionPane.YES_NO_OPTION,
    JOptionPane.WARNING_MESSAGE
);
if (result == JOptionPane.YES_OPTION) {
    // 執行刪除
}

3. 文本輸入


String input = JOptionPane.showInputDialog(
    null,
    "請輸入用戶名:",
    "用戶登錄",
    JOptionPane.QUESTION_MESSAGE
);
if (input != null && !input.trim().isEmpty()) {
    // 用戶點擊 OK 且輸入非空
}

4. 下拉選擇輸入


Object[] roles = {"管理員", "操作員", "訪客", "審核員"};
Object selected = JOptionPane.showInputDialog(
    null,
    "選擇角色:",
    "角色授權",
    JOptionPane.INFORMATION_MESSAGE,
    null,           // 無自定義圖標
    roles,          // 選項數組
    roles[0]        // 默認選中
);
if (selected != null) {
    System.out.println("用戶選擇: " + selected);
}

5. 完全自定義按鈕 (ATM 示例)


Object[] options = {"查詢餘額", "存款", "取款", "退出"};
int choice = JOptionPane.showOptionDialog(
    null,
    "請選擇業務類型",
    "ATM 服務",
    JOptionPane.YES_OPTION,       // optionType 忽略 (有自定義 options)
    JOptionPane.PLAIN_MESSAGE,    // 無圖標
    null,                         // 無自定義圖標
    options,                      // 按鈕文本
    options[0]                    // 默認聚焦
);

switch (choice) {
    case 0: showMessage("您選擇了查詢餘額"); break;
    case 1: showMessage("您選擇了存款"); break;
    case 2: showMessage("您選擇了取款"); break;
    case 3: showMessage("您選擇了退出"); break;
    case JOptionPane.CLOSED_OPTION: showMessage("用戶關閉對話框"); break;
}

進階定製技巧

自定義圖標


ImageIcon icon = new ImageIcon(getClass().getResource("/icons/logo.png"));
JOptionPane.showMessageDialog(null, "品牌專屬提示", "標題", JOptionPane.PLAIN_MESSAGE, icon);

複雜內容組件 (表單、進度條、表格)


JPanel panel = new JPanel(new GridLayout(3,2));
panel.add(new JLabel("用戶名:")); panel.add(new JTextField(15));
panel.add(new JLabel("密碼:"));  panel.add(new JPasswordField(15));
panel.add(new JLabel("記住我:")); panel.add(new JCheckBox());

int result = JOptionPane.showConfirmDialog(null, panel, "登錄", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
    // 從 panel 子組件獲取值
}

非模態/自定義行為


// JOptionPane 本身是模態的,如需非模態需直接使用 JDialog
JDialog dialog = new JDialog(frame, "非模態提示", false);
dialog.add(new JLabel("後台處理中..."));
dialog.pack();
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);

本地化/皮膚

  • 按鈕文本由 UIManager 控制:UIManager.put("OptionPane.yesButtonText", "確定")
  • LookAndFeel 影響外觀:UIManager.setLookAndFeel(new FlatLightLaf()) (FlatLaf 現代主題)

常見問題

問題原因解決
對話框不居中parentComponent 為 null 但有多螢幕傳入具體 Frame 或用 setLocationRelativeTo
輸入框返回 null用戶點擊取消/關閉/ESC判空處理:if (input != null)
中文顯示方塊字體不支援中文設置全局字體:UIManager.put("OptionPane.font", new Font("微軟雅黑", Font.PLAIN, 14))
模態阻塞 EDT長耗時操作在事件線程耗時任務放 SwingWorker,對話框僅收集參數

總結

JOptionPane 以靜態工廠方法封裝了最常見的模態交互模式,**優先使用最簡單的方法** (showMessageDialog/showConfirmDialog/showInputDialog),複雜場景才用 showOptionDialog 或直接構建 JDialog。注意模態阻塞 EDT,保持對話框邏輯輕量,複雜表單建議獨立視圖組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved