清除后,JTextField停止使用MaskFormatter

时间:2012-02-20 17:47:26

标签: java swing jtextfield jformattedtextfield

我正在做一个数独求解器,为此我希望我的JTextFields只接受其中一个数字123456789作为有效输入。因此我使用MaskFormatter与JFormattedTextField一起使用。但是,当我通过执行.setText(“”)清除所有TextField时,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 个答案:

答案 0 :(得分:1)

我无法告诉你确切的原因,但是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!按钮格式化程序继续工作,因为它应该可以工作。