利用 JOptionPane 實現控制台風格的交互式矩陣生成程式,展示輸入對話框、整數解析驗證、遞歸菜單循環、錯誤處理等 Swing 基礎交互模式。適合初學者理解事件驅動與模態對話框流程控制。
import javax.swing.*;
public class MatrixPrinter {
public static void main(String[] args) {
// 入口:啟動交互循環
int shouldContinue = showMatrixDialog();
// 程式結束 (JOptionPane 模態對話框阻塞,此行僅在用戶選「否」後執行)
System.exit(0);
}
// 顯示矩陣生成對話框,返回用戶選擇:1=繼續, 0=退出
static int showMatrixDialog() {
// 1. 輸入行數
String rowStr = JOptionPane.showInputDialog(null, "請輸入矩陣行數 (正整數):", "矩陣生成器", JOptionPane.QUESTION_MESSAGE);
if (rowStr == null) return 0; // 用戶點取消/關閉
// 2. 輸入列數
String colStr = JOptionPane.showInputDialog(null, "請輸入矩陣列數 (正整數):", "矩陣生成器", JOptionPane.QUESTION_MESSAGE);
if (colStr == null) return 0;
// 3. 解析並驗證
int rows, cols;
try {
rows = Integer.parseInt(rowStr.trim());
cols = Integer.parseInt(colStr.trim());
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "輸入無效:請輸入整數!", "錯誤", JOptionPane.ERROR_MESSAGE);
return showMatrixDialog(); // 遞歸重試
}
if (rows <= 0 || cols <= 0) {
JOptionPane.showMessageDialog(null, "行數和列數必須大於 0!", "錯誤", JOptionPane.ERROR_MESSAGE);
return showMatrixDialog(); // 遞歸重試
}
// 4. 生成矩陣字符串
StringBuilder matrix = new StringBuilder();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix.append("* ");
}
matrix.append("\n");
}
matrix.append("\n這是您想要的圖形: ").append(rows).append(" 行 × ").append(cols).append(" 列");
// 5. 顯示結果 (使用不可編輯文本區域支援換行)
JTextArea textArea = new JTextArea(matrix.toString());
textArea.setEditable(false);
textArea.setFont(new java.awt.Font("Monospaced", java.awt.Font.PLAIN, 14));
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new java.awt.Dimension(300, 200));
JOptionPane.showMessageDialog(null, scrollPane, "生成結果", JOptionPane.INFORMATION_MESSAGE);
// 6. 詢問是否繼續
Object[] options = {"是 (繼續)", "否 (退出)"};
int choice = JOptionPane.showOptionDialog(
null, "您想再次生成矩陣嗎?", "繼續?",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
null, options, options[0]
);
return (choice == 0) ? showMatrixDialog() : 0; // 遞歸或退出
}
}
| 技術點 | 代碼體現 | 說明 |
|---|---|---|
| 模態對話框阻塞 | showInputDialog, showMessageDialog | 代碼執行暫停,等待用戶操作,簡化流程控制 |
| 輸入驗證與異常處理 | Integer.parseInt + try-catch + 範圍檢查 | 防止非數字、負數、零值導致邏輯錯誤 |
| 遞歸實現菜單循環 | return showMatrixDialog() | 利用調用棧維持狀態,代碼簡潔;注意深度過大可能 StackOverflow (本場景無風險) |
| 多行文本顯示 | JTextArea + JScrollPane + 等寬字體 | showMessageDialog 單行顯示不換行,需包裝組件 |
| 用戶取消處理 | rowStr == null 檢查 | 用戶點「取消」或關閉視窗返回 null,需優雅退出 |
| 選項對話框自定義按鈕 | showOptionDialog + Object[] options | 超越 Yes/No/Cancel,自定義文本、圖標、預設選項 |
// 1. 遞歸改迴圈 (避免理論上 StackOverflow)
public void run() {
while (true) {
if (!showAndProcessOnce()) break;
}
}
// 2. 分離關注點:輸入、計算、顯示、控制
int[] readDimensions() { /* 返回 int[2] 或 null 表示取消 */ }
String generateMatrix(int rows, int cols) { /* 純函數,易測試 */ }
void showMatrix(String matrix) { /* UI 邏輯 */ }
boolean askContinue() { /* 返回 boolean */ }
// 3. 非阻塞異步版本 (SwingWorker/JavaFX Task)
// 適用於耗時計算、大矩陣生成,避免凍結 EDT
// 4. 國際化 (i18n)
// 所有字符串提取到 ResourceBundle
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
JOptionPane.showMessageDialog(null, matrixStr) | 長字符串單行顯示、換行符無效 | 包裝 JTextArea + JScrollPane |
未檢查 null 直接 parseInt | 用戶取消拋 NullPointerException | if (str == null) return; |
Integer.parseInt(" 12 ") 不 trim | 前後空格拋 NumberFormatException | str.trim() |
| 遞歸無終止條件 | 無限遞歸 → StackOverflowError | 明確返回值控制遞歸深度 |
| 在 EDT 中執行耗時操作 | 界面凍結、無響應 | SwingWorker 或 JavaFX Task |
本例展示了 JOptionPane 系統構建交互式控制台應用的完整模式:輸入 → 驗證 → 計算 → 顯示 → 循環決策。掌握模態對話框阻塞特性、輸入驗證最佳實踐、多行文本顯示技巧、遞歸/迴圈菜單控制,能快速構建原型工具、教學演示、簡單配置向導。進階時注意關注點分離、EDT 非阻塞、國際化,向生產級代碼演進。