Я выполняю это задание, сделать программу, которая решает судоку. У меня есть панель с сеткой SudokuTextBox, расширяющей JFormattedTextField. У меня есть MaskFormatter, поэтому он принимает только одно целое число для каждого текстового поля. Затем на моей панели у меня есть этот код, когда ключ высвобождается.
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();
}
Дело в том, что если я помещаю допустимое значение в текстовое поле, затем я возвращаюсь и ввожу недопустимое значение (по правилам судоку), текстовое поле очищается. Но затем, когда я ввожу вперед, предыдущее действительное значение отображается в текстовом поле. Моя судокуматрица, содержащая все введенные числа, очищает значение, как и должно быть, поэтому оно находится только в соответствующем текстовом поле.
Чтобы сделать ситуацию еще более запутанной, когда я меняю «SudokuTextBox extends JFormattedTextField» на «SudokuTextBox extends JTextField», это работает как шарм. Но я не могу установить размер JTextField так, чтобы он был квадратным, и я не могу применить только одно целое число для каждого текстового поля.
Я упускаю что-то действительно очевидное?