首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java Swing 彈出模態對話框實現:JDialog 替代 JFrame

     編輯:程式設計疑難解答

需求

點擊主視窗按鈕彈出子視窗,子視窗包含輸入欄位與功能按鈕;子視窗關閉前,主視窗不可操作(模態)。

推薦方案:使用 JDialog

JFrame 為頂層視窗,預設非模態;JDialog 專為對話框設計,支援模態模式。

核心代碼

// 主視窗按鈕事件
JDialog dialog = new JDialog(parentFrame, "標題", true); // true = 模態
dialog.setLayout(new GridLayout(3, 2));
dialog.add(new JLabel("姓名:"));
JTextField tfName = new JTextField();
dialog.add(tfName);
dialog.add(new JLabel("年齡:"));
JTextField tfAge = new JTextField();
dialog.add(tfAge);
JButton btnOk = new JButton("確定");
btnOk.addActionListener(e -> {
    // 取值處理
    dialog.dispose();
});
JButton btnCancel = new JButton("取消");
btnCancel.addActionListener(e -> dialog.dispose());
dialog.add(btnOk);
dialog.add(btnCancel);
dialog.pack();
dialog.setLocationRelativeTo(parentFrame);
dialog.setVisible(true); // 這裡阻塞,直到 dialog 關閉

關鍵點

  • 建構子第 3 參數 true 啟用模態,阻塞父視窗輸入焦點。
  • setLocationRelativeTo(parentFrame) 讓對話框居中顯示於父視窗。
  • pack() 自動依元件優選尺寸。
  • 若需回傳資料,可定義 getResult() 方法或使用 PropertyChangeListener。

參考資源

完整範例下載:Swing 模態對話框範例

避坑提醒

  • 切勿在事件執行緒中執行耗時操作,否則 UI 會凍結;耗時任務請用 SwingWorker。
  • 若需非模態浮動面板,可用 JWindow 或 JFrame + setAlwaysOnTop(true)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved