我正在做一个数独求解器,为此我希望我的JTextFields只接受数字123456789中的一个作为有效输入。因此,我使用MaskFormatter将其与JFormattedTextField进行比较。然而,当我通过.setText(")清除所有TextFields时,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
此外,经过更多的测试,似乎在清除所有框后,你可以键入很多不应该存在的字符,但当你点击另一个字段时,所有字符都会消失。然后,如果你点击其他框,你之前写的数字就会出现。
别这样!
我不能告诉你确切的原因,但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后按钮格式化程序继续按预期工作。