Wong,
не уверен, используете ли вы Swing или нет ...
Много лет назад у меня была такая же проблема, и я решил ее, создав класс RestrictedTextField, расширяющий JTextField.В конструктор я добавил слушателя ключа (addKeyListener (new RestrictedKeyAdapter ());)
private class RestrictedKeyAdapter extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
if (getText().equals("")) {
oldString = "";
return;
} else {
// if you cannot parse the string as an int, or float,
// then change the text to the text before (means: ignore
// the user input)
try {
if (type.equals("int")) {
int i = Integer.parseInt(getText());
oldString = getText();
} else if (type.equals("float")) {
float f = Float.parseFloat(getText());
oldString = getText();
} else {
// do nothing
}
} catch (NumberFormatException el) {
setText(oldString);
}
// if the text is identical to the initial text of this
// textfield paint it yellow. If the text was changed
// paint it red.
if (initialString.equals(getText())) {
setForeground(Color.YELLOW);
} else {
setForeground(Color.RED);
}
}
}
}
Идея состоит в том, что каждый раз, когда пользователь нажимает клавишу в текстовом поле (и затем ее отпускает),текст в текстовом поле анализируется.Например, если компонент должен принимать только числа с плавающей точкой, он пытается проанализировать его как число с плавающей точкой (Float.parseFloat (..)).Если этот анализ успешен, все хорошо.Если синтаксический анализ не выполняется (генерируется исключение NumberFormatException), тогда старый текст записывается обратно в текстовое поле (буквально игнорируя ввод пользователя).
Я думаю, что вы можете добавить KeyAdapter непосредственно в JTextField, не создавая выделенный классдля этого, но с этим решением вы можете вспомнить исходную строку и старую строку.
вы можете поиграться с кодом .. вы можете изменить цвет текстового поля, если ввод действителен или нет (или как в моем фрагменте кода, если текст идентичен исходной строке).
один дополнительный комментарий: я установил «тип» текстового поля в переменной с именем «тип», которая представляет собой просто строку со значениями «int», «float» и т. Д .... лучшерешение было бы здесь, например, перечисление конечно ...
Я надеюсь, что это полезно ...
Тимо