Я выполняю это задание, создаю программу, которая решает судоку. У меня есть панель с сеткой SudokuTextBox, расширяющая JFormattedTextField. У меня есть MaskFormatter, так что он принимает только одно целое число для каждого текстового поля. Затем на моей панели у меня появляется этот код при повторном вводе ключа.
Дело в том, что если я помещаю допустимое значение в текстовое поле, затем возвращаюсь и ввожу недопустимое значение (по правилам судоку), текстовое поле очищается. Но затем, когда я переадресовываю табуляцию, в текстовом поле отображается предыдущее допустимое значение. Моя судокуматрица, содержащая все введенные числа, очищает значение, как и должно быть, поэтому оно находится только в соответствующем текстовом поле.
Чтобы еще больше запутать ситуацию, когда я меняю "SudokuTextBox расширяет JFormattedTextField" на "SudokuTextBox расширяет JTextField", это работает как по волшебству. Но я не могу установить размер JTextField таким образом, чтобы он был квадратным, и я не могу принудительно использовать только одно целое число для текстового поля.
Я упускаю что-то действительно очевидное?
Переведено автоматически
Ответ 1
Вот пример компонента с изменяемым размером, который может подойти для такой игры. Хотя он не содержит игровой логики, он достаточно хорошо обрабатывает ввод. Щелчок мыши или нажатие пробела вызывает всплывающее меню, а клавиши табуляции и цифровые клавиши работают должным образом. В частности, Digit.EMPTY является допустимым значением.
Итак, теперь я нашел это: "Одним из недостатков средства форматирования масок является то, что, начиная с текущей реализации (Java 5), в нем нет поддержки, позволяющей пользователю возвращать полю пустое значение (начальное значение поля до любого пользовательского ввода), как только они покинули поле в любой момент".
Итак, поскольку я использую MaskFormatter, я не могу очистить поле.
Ответ 3
Хотя это и не идентичный вопрос, я просматривал (слишком много) вопросов, подобных этому. В моем случае я хотел иметь возможность заполнить два других поля (jtfStarePatReq и jtfStarePatFound, которые являются JTextFields) либо путем прямого поиска индекса, либо с помощью некоторых блесен и создания строки, а затем просмотра этой строки (ладно, возможно, это слишком расплывчато, но я думаю, что контекста достаточно). Я хотел, чтобы, если пользователь удалил или очистил значение в JFormattedTextField jftfStareOpsIndex , то также были очищены два других поля. Я использовал метод .isEmpty() для JFormattedTextField, чтобы решить, следует ли мне использовать это поле ИЛИ использовать более длительный вычисляемый метод поиска. Поэтому мне НУЖНО, чтобы оно было пустым, если кто-то перейдет от поиска своего собственного индекса к разрешению программному обеспечению выполнять поиск по индексу. В любом случае, я попытался перехватить исключение CommitEdit() и установить значение равным null, и, похоже, это сработало.