JTextField прекращает использование MaskFormatter после очистки - PullRequest
0 голосов
/ 20 февраля 2012

Я делаю решатель судоку, и для этого я хочу, чтобы мои JTextFields принимали только одно из чисел 123456789 в качестве допустимого ввода. Поэтому я использую MaskFormatter вместе с JFormattedTextField. Однако, когда я очищаю все поля TextFields с помощью .setText (""), MaskFormatter больше не работает. После очистки текстовых полей я могу снова написать в них что угодно. Почему и как мне это исправить?

Мой код в основном:

MaskFormatter formatter = new MaskFormatter("#");
formatter.setValidCharacters("123456789");
Font textFieldFont = new Font("Verdana", Font.BOLD, 30);
for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
        southPanel.setBorder(lineBorder);
        field[i][j] = new JFormattedTextField(formatter);
        field[i][j].setHorizontalAlignment(JTextField.CENTER);
        field[i][j].setFont(textFieldFont);
        southPanel.add(field[i][j]);
    }
}

Тогда, когда я это очищу:

for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
        field[i][j].setText("");
    }
}

РЕДАКТИРОВАТЬ: Вот весь код, я не написал большую его часть, потому что мой друг сделал это. Я только сейчас немного исправлю GUI.

http://dl.dropbox.com/u/4018313/SudokuSolver.zip

Кроме того, после некоторого дополнительного тестирования кажется, что после очистки всех полей вы можете ввести много символов, которых там быть не должно, но при нажатии на другое поле все они исчезнут. Затем, если вы щелкнете в других полях, появятся цифры, которые вы написали ранее.

Не понимаю!

1 Ответ

1 голос
/ 20 февраля 2012

Я не могу сказать вам точную причину, но setText, кажется, сводит ваш JFormattedTextField с ума, потому что "" - это строка, и она против текущей маски.

Пожалуйста, попробуйте использовать setValue(null).

Я только что убедился, что этот метод работает. Следующий фрагмент кода доказывает это:

public class Two extends JFrame {

    public static void main(String[] args) throws Exception {
        new Two().a();
    }

    void a() throws Exception {
        this.setLayout(new GridLayout(2, 1));
        MaskFormatter formatter = new MaskFormatter("#");
        formatter.setValidCharacters("123456789");
        final JFormattedTextField field = new JFormattedTextField(formatter);
        JButton b = new JButton("null!");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                field.setValue(null);
            }
        });
        this.add(field);
        this.add(b);
        this.setSize(100, 100);
        this.setVisible(true);
    }
}

После нажатия кнопки null! средство форматирования продолжает работать так, как и должно работать.

...