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

Swing JOptionPane 交互式矩陣打印:輸入驗證、循環菜單與遞歸調用實戰

     編輯:Java 程式設計入門

利用 JOptionPane 實現控制台風格的交互式矩陣生成程式,展示輸入對話框、整數解析驗證、遞歸菜單循環、錯誤處理等 Swing 基礎交互模式。適合初學者理解事件驅動與模態對話框流程控制。

完整代碼:MatrixPrinter.java

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用戶取消拋 NullPointerExceptionif (str == null) return;
Integer.parseInt(" 12 ") 不 trim前後空格拋 NumberFormatExceptionstr.trim()
遞歸無終止條件無限遞歸 → StackOverflowError明確返回值控制遞歸深度
在 EDT 中執行耗時操作界面凍結、無響應SwingWorker 或 JavaFX Task

總結

本例展示了 JOptionPane 系統構建交互式控制台應用的完整模式:輸入 → 驗證 → 計算 → 顯示 → 循環決策。掌握模態對話框阻塞特性、輸入驗證最佳實踐、多行文本顯示技巧、遞歸/迴圈菜單控制,能快速構建原型工具、教學演示、簡單配置向導。進階時注意關注點分離、EDT 非阻塞、國際化,向生產級代碼演進。

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