Note that there are some explanatory texts on larger screens.

plurals
  1. POJAVA SWING: Unable to change text of JTextField
    text
    copied!<p>I am working on a program to generate and solve sudoku puzzles in java using a swing gui. I am having a problem where I use the .setText() method on a JTextField but the text is not updated.</p> <p>Here is my code:</p> <p>main class:</p> <pre><code>package sudoku; public class SudokuSolver { public static void main(String[] args) { GUI gui = new GUI(); gui.setVisible(true); } } </code></pre> <p>GUI class:</p> <pre><code>package sudoku; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JButton; import java.awt.Window.Type; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GUI extends JFrame implements ActionListener { private JPanel contentPane; private Puzzle puzzle = new Puzzle(); private Board board = new Board(); private int[][] puzz = new int[9][9]; // GUI Constructor public GUI() { // set up window setResizable(false); setTitle("Sudoku Solver"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 300, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); // set up button panel JPanel buttons = new JPanel(); contentPane.add(buttons, BorderLayout.SOUTH); // set up generate button JButton genButton = new JButton("Generate"); genButton.setMnemonic('g'); buttons.add(genButton); genButton.addActionListener(this); // set up solve button JButton solveButton = new JButton("Solve"); solveButton.setMnemonic('s'); buttons.add(solveButton); solveButton.addActionListener(this); // set up board contentPane.add(board, BorderLayout.CENTER); } // Button listener public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd == "Generate") { // generate puzzle puzz = puzzle.generate(); } else if (cmd == "Solve") { // solve puzzle puzz = puzzle.solve(puzz); } // display puzzle on the board board.fill(puzz); } } </code></pre> <p>Board class:</p> <pre><code>package sudoku; import java.awt.Color; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JPanel; public class Board extends JPanel { // 9x9 board sections private BoardSection nw = new BoardSection(); private BoardSection n = new BoardSection(); private BoardSection ne = new BoardSection(); private BoardSection w = new BoardSection(); private BoardSection c = new BoardSection(); private BoardSection e = new BoardSection(); private BoardSection sw = new BoardSection(); private BoardSection s = new BoardSection(); private BoardSection se = new BoardSection(); // array of sections private BoardSection[] sections = { nw, n, ne, w, c, e, sw, s, se }; // Board Constructor public Board() { // 3x3 grid layout setLayout(new GridLayout(3, 3)); // border setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); // add board sections to board for (int i = 0; i &lt; sections.length; i++) { sections[i] = new BoardSection(); add(sections[i]); } } // fill the board with data public void fill(int[][] data) { // create data sections String[][] nwData = new String[3][3]; String[][] nData = new String[3][3]; String[][] neData = new String[3][3]; String[][] wData = new String[3][3]; String[][] cData = new String[3][3]; String[][] eData = new String[3][3]; String[][] swData = new String[3][3]; String[][] sData = new String[3][3]; String[][] seData = new String[3][3]; // break data into data sections nwData = createSection(data, 0, 0); nData = createSection(data, 3, 0); neData = createSection(data, 6, 0); wData = createSection(data, 0, 3); cData = createSection(data, 3, 3); eData = createSection(data, 6, 3); swData = createSection(data, 0, 6); sData = createSection(data, 3, 6); seData = createSection(data, 6, 6); // fill board section with data section nw.fillSection(nwData); n.fillSection(nData); ne.fillSection(neData); w.fillSection(wData); c.fillSection(cData); e.fillSection(eData); sw.fillSection(swData); s.fillSection(sData); se.fillSection(seData); } // split data into 3x3 section with 0,0 starting at x, y then convert to // string private String[][] createSection(int[][] data, int x, int y) { int[][] intSection = new int[3][3]; String[][] strSection = new String[3][3]; // break into section for (int i = 0; i &lt; 3; i++) { for (int j = 0; j &lt; 3; j++) { intSection[i][j] = data[i + x][j + y]; } } // convert section to string for (int i = 0; i &lt; 3; i++) { for (int j = 0; j &lt; 3; j++) { strSection[i][j] = Integer.toString(intSection[i][j]); } } return strSection; } } </code></pre> <p>BoardSection class:</p> <pre><code>package sudoku; import java.awt.Color; import java.awt.GridLayout; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.BorderFactory; public class BoardSection extends JPanel { // each square private JTextField nw = new JTextField(); private JTextField n = new JTextField(); private JTextField ne = new JTextField(); private JTextField w = new JTextField(); private JTextField c = new JTextField(); private JTextField e = new JTextField(); private JTextField sw = new JTextField(); private JTextField s = new JTextField(); private JTextField se = new JTextField(); // array of the squares private JTextField[] fields = new JTextField[] { nw, n, ne, w, c, e, sw, s, se }; // Board Section Constructor public BoardSection() { // 3x3 grid layout setLayout(new GridLayout(3, 3)); // border setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); // add all fields to the board section for (int i = 0; i &lt; fields.length; i++) { fields[i] = new JTextField(1); fields[i].setHorizontalAlignment(JTextField.CENTER); fields[i].setEditable(false); add(fields[i]); } } // Display the data on the board public void fillSection(String[][] data) { int x = 0; for (int i = 0; i &lt; 3; i++) { for (int j = 0; j &lt; 3; j++) { fields[x].setText(data[i][j]); x++; } } } } </code></pre> <p>I also have another class called Puzzle where there is a generate() and a solve() method that both return int[][]. I don't believe anything in it is relevant to the problem so I'm omitting it for space.</p> <p>The problem is with this line is the BoardSection class:</p> <pre><code>fields[x].setText(data[i][j]); </code></pre> <p>I am not getting any error messages, however it is not updating the text. I tried replacing data[i][j] with "Z" to see if the problem was the data I was passing but it still doesn't work with just a simple string. I did however try putting the following line in the for loop that is inside the BoardSection constructor method and it DID display.</p> <pre><code>fields[i].setText("0"); </code></pre> <p>Can anyone explain why it works in the constructor but not when the fillSection() method is called?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload