如何获取数独GUI构造方法中创建的JTextField的值
搞定这个问题很简单,核心是把那些局部的JTextField变成类的成员变量,这样你就能在任何需要的地方访问它们的值。我给你一步步拆解解决方案:
解决方案步骤
1. 定义类成员变量存储所有JTextField
首先,在GUI类里添加一个9x9的JTextField二维数组,作为类的成员变量。这样整个类的方法(比如按钮的点击事件处理器)都能访问到这些文本框:
public class GUI extends JFrame { public static JButton solveButton = new JButton("Solve"); // 添加这行,存储所有数独单元格的文本框 private JTextField[][] sudokuCells = new JTextField[9][9]; // 构造方法... }
2. 在构造方法中初始化并关联数组
原来的构造方法里,你是在循环中创建局部的JTextField,现在要把每个创建的文本框赋值到数组对应的位置。注意要计算每个小单元格对应的全局行和列(因为你用了3x3的大面板嵌套):
public GUI() { // Create panel for Sudoku JPanel board = new JPanel(); board.setLayout(new GridLayout(3, 3)); board.setBorder(BorderFactory.createLineBorder(Color.BLACK)); for (int boxRow = 0; boxRow < 3; ++boxRow) { for (int boxCol = 0; boxCol < 3; ++boxCol) { JPanel box = new JPanel(new GridLayout(3, 3)); box.setBorder(BorderFactory.createLineBorder(Color.GRAY)); // 遍历每个大框里的3x3小单元格 for (int cellRow = 0; cellRow < 3; cellRow++) { for (int cellCol = 0; cellCol < 3; cellCol++) { // 计算全局的行和列索引(0-8) int globalRow = boxRow * 3 + cellRow; int globalCol = boxCol * 3 + cellCol; // 创建文本框,设置样式(比如居中、限制输入长度) JTextField cell = new JTextField(); cell.setHorizontalAlignment(JTextField.CENTER); cell.setFont(new Font("Arial", Font.PLAIN, 20)); // 把文本框存入数组 sudokuCells[globalRow][globalCol] = cell; box.add(cell); } } board.add(box); } } // 把solveButton添加到界面,这里可以给按钮加点击事件来获取值 add(board, BorderLayout.CENTER); add(solveButton, BorderLayout.SOUTH); // 给按钮绑定事件处理器,示例如何获取值 solveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int[][] sudokuValues = getSudokuValues(); // 这里就可以用获取到的数独数值做后续处理(比如求解) System.out.println("获取到的数独值:"); for (int[] row : sudokuValues) { for (int val : row) { System.out.print(val + " "); } System.out.println(); } } }); // 设置窗口基本属性 setTitle("Sudoku Solver"); setSize(500, 550); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); }
3. 编写获取值的工具方法
写一个方法来遍历数组,把每个JTextField的内容转换成整数。这里要处理用户输入为空或者非数字的情况(比如默认设为0,或者提示错误):
private int[][] getSudokuValues() { int[][] values = new int[9][9]; for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { String text = sudokuCells[row][col].getText().trim(); try { // 把文本转成整数,空的话设为0(数独里0代表空单元格) values[row][col] = text.isEmpty() ? 0 : Integer.parseInt(text); // 额外校验:数独数值只能是1-9或者0,超出范围的话也设为0 if (values[row][col] < 0 || values[row][col] > 9) { values[row][col] = 0; sudokuCells[row][col].setText(""); // 清空错误输入 } } catch (NumberFormatException ex) { // 输入非数字,设为0并清空文本框 values[row][col] = 0; sudokuCells[row][col].setText(""); } } } return values; }
为什么要这么做?
原来的代码里,JTextField是构造方法里的局部变量,一旦构造方法执行完,这些变量就无法被其他方法访问。把它们存到类的成员数组里后,整个类的任何方法(比如按钮的点击事件处理器)都能随时获取每个单元格的值。
内容的提问来源于stack exchange,提问作者Farhan Shafi
相关产品推荐
相关产品推荐

