问题
I'm doing a Sudoku solver and for that I want my JTextFields to only accept one of the numbers 123456789 as valid input. Therefore I use a MaskFormatter toghether with a JFormattedTextField. However when I clear all the TextFields by doing .setText("") the MaskFormatter doesn't work anymore. After clearing the textboxes I can write anything in them again. Why and how do I fix it?
My code is basically:
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]);
}
}
Then when I clear it:
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
field[i][j].setText("");
}
}
EDIT: Here is all the code, haven't written most of it cuz my friend did it. I'm just now taking over to fix the GUI a little bit.
http://dl.dropbox.com/u/4018313/SudokuSolver.zip
Also, after some more testing it seems like after clearing all the boxes you can type a lot of charachters that should not be there but when you click on another field all of them will disappear. Then if you click in the other boxes the numbers you wrote earlier will appear.
Don't get this!
回答1:
I can't tell you the exact reason but setText
seems to drive your JFormattedTextField
crazy because ""
is a String and it is against the current mask.
Please try using setValue(null)
instead.
I've just made sure that this method works. The next piece of code proves it:
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);
}
}
After clicking the null! button formatter continues to work as it is supposed to work.
来源:https://stackoverflow.com/questions/9365862/jtextfield-stops-using-maskformatter-after-being-cleared