У меня есть JTextField, для которого я переопределил документ, так что я могу помешать пользователю ввести некоторые символы. Как это работает мой расширение документа получает Regex в своем конструкторе, затем проверяет все, что вводит пользователь против Regex:JTextField с приложением regex не будет принимать значение до тех пор, пока не будет применен документ
public class ValidDocument extends PlainDocument
{
private String regex;
public ValidDocument(String regex)
{
this.regex = regex;
}
@Override
public void insertString(int offs, String str, AttributeSet a)
{
if(str == null) return;
try
{
if((this.getText(0, getLength()) + str).matches(regex))
super.insertString(offs, str, a);
}
catch(BadLocationException ble)
{
System.out.println("Came across a BadLocationException");
}
}
}
у меня была проблема однако, когда JTextField, что я хотел, чтобы отобразить только один действительный поплавок/double numbers in не отображает его начальное значение. Код, который я использовал, приведен ниже:
float value = 25.0f;
JTextField textField = new JTextField("" + value);
textField.setDocument(new ValidDocument("^(\\-)?\\d*(\\.)?\\d*$"));
Так отображается JTextField, но начального значения не было. Я попытался ввести 25.0 в поле, и он согласился с тем, что я изначально ожидал. После немного начинки, я попытался добавить:
textField.setText("" + value);
И это отобразило значение. Мне пришло в голову, что он может принять все, что я пытался поставить в SetText(), так что я добавил буквенные символы к нему:
textField.setText("as" + value);
Как я и подозревал, он включал буквенные символы, даже если Regex должен был предотвратить что. Поэтому я считаю, что при использовании этой функции документ обходит.
Может ли кто-нибудь пролить свет на то, почему применение ValidDocument в моем JTextField удаляет текст, который я разместил в конструкторе текстового поля? У меня есть другие JTextFields с менее ограничительным Regex, которые все еще отображают значение, заданное в конструкторе. И почему это будет переопределять значение, переданное в конструктор, но не тот, который передается в setText()?
запрещает пользователю вводить некоторые символы. == DocumentFilter – mKorbel
, где JTextField, который я хотел отображать только действительные числа float/double, не отображал его начальное значение. ==, а затем, чтобы проанализировать вход пользователей в Float/Double, вопрос в том, зачем беспокоиться с простым JTextField, не является JFormattedTextField лучше, чем ... (для стандартного ввода) – mKorbel
Хм ... Теперь я посмотрю на JFormattedTextField. Спасибо за направление – Stevo