Search code examples
javajtextfieldsudokukeyeventjformattedtextfield

JFormattedTextField is not properly cleared


I am doing this assignment, make a program that solves sudoku. I have a panel with a grid of SudokuTextBox extends JFormattedTextField. I have a MaskFormatter so that it only accepts one integer per text box. Then in my panel I have this code when a key is relesed.

 public void keyReleased(KeyEvent e) {
  SudokuTextBox tb = (SudokuTextBox) e.getSource();
  int row = tb.getRow();
  int col = tb.getCol();
  int value = toInteger(tb.getText());
  //System.out.println(value);
  if(sudoku.isValid(row, col, value)) {
   sudoku.set(row, col, value);
  }
  else {
   sudoku.set(row, col, 0);
   tb.setText(null);
  }
  tb.setCaretPosition(0);
  sudoku.print();
 }

The thing is, if i put a valid value in a text box, then i go back and enter an invalid value (by the rules of sudoku) the text box is cleared. But then when I tab forward the previous valid value is displayed in the text box. My sudokumatrix that contains all the numbers that has been inputed do clear the value like it should so it is only in the corresponding text box.

To make matters even more confusing when i change "SudokuTextBox extends JFormattedTextField" to "SudokuTextBox extends JTextField" it works like a charm. But i cant set the size of JTextField so that it is square and I can not enforce only one integer per text box.

Am I missing something really obvious?


Solution

  • Ok so now I found it, "One of the shortcomings of the mask formatter is that as of the current implementation (Java 5), it has no support for letting a user revert a field to the blank value (the initial value of the field prior to any user input) once they have left the field at any point."

    So since I am using a MaskFormatter I cannot clear the field.