2

Первое, что я сделать, это создать NumberFormat, который соответствует моим потребностям:Есть ли способ принудительного подтверждения после применения формата к JFormattedTextField?

this.format = NumberFormat.getIntegerInstance(); 
this.format.setMinimumIntegerDigits(6); 
this.format.setMaximumIntegerDigits(6); 
this.format.setGroupingUsed(false); 

я применить его к JFormattedTextField:

this.fld_id = new JFormattedTextField(this.format); 

Затем я этого поля InputVerifier, например, так:

this.fld_id.setInputVerifier(new IdVerifier()); 

Мой IdVerifier просто смотрит, чтобы увидеть, что введенный текст соответствует регулярным выражение:

private class IdVerifier extends InputVerifier { 
     public boolean verify(final JComponent arg0) { 
      final JFormattedTextField verifyJTF = (JFormattedTextField) arg0; 

      if (!verifyJTF.getText().matches("\\d{6}")) { 
       return false; 
      } 

      return true; 
     } 

     public boolean shouldYieldFocus(final JComponent arg0) { 
      if (!this.verify(arg0)) { 
       arg0.setBackground(Color.RED); 
      } else { 
       arg0.setBackground(UIManager.getColor("TextField.background")); 
      } 

      return true; 
     } 
} 

Однако, когда я делаю это, я ввожу значение в JFormattedTextField, скажем, «1». Это переформатируется на «000001» на NumberFormatter. Однако в этом примере фон текстового поля по-прежнему установлен на красный.

Каков правильный способ гарантировать, что отформатированное содержимое JFormattedTextField - это то, что потребляется InputVerifier? Я ожидал, что поведение по умолчанию заключается в том, что фокус потерян, применяется форматирование, после чего ввод проверяется. Однако это явно не так.

ответ

-1

Изменить регулярное выражение будет \\d{1,6}, это, вероятно, не принимает ведущие нули в качестве числа

+0

Прошло много времени с тех пор, как я выполнил работу с графическим интерфейсом, но [учебники по Oracle предлагают сделать это по-моему) (http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html) , вот почему я это сделал. В разделе «Проверка ввода» они вызывают звуковой сигнал в методе 'shouldYieldFocus()'. Я не вижу разницы между изменением цвета поля и звуком. Это может быть плохой пример в учебниках, но я не вижу, как перемещение фона с метода 'verify()' в метод 'shouldYieldFocus()' решит что угодно. –

+0

Да, также прочитайте это сейчас, мое плохое - возможно, это связано с регулярным epxression ... прочитайте мою обновленную запись. –

+0

Это меняет смысл моего регулярного выражения. Вероятно, это будет работать из-за форматирования, но я не хочу полагаться на присутствующий форматтер. {1,6} означает не менее 1, но не более 6 раз - единственный действительный вход - ровно 6 цифр. –

0

Глядя на определение для InputVerifier, это не звучит как GUI работа должна проходить внутри либо verify или shouldYieldFocus. InputVerifier предназначен исключительно для принятия решения о том, следует ли фокус переходить из одного поля в другое.

Я думаю, вам лучше скрепить ActionListener на JFormattedTextField, а затем просто вызвать ваше регулярное выражение и код красной живописи в теле этого слушателя. Затем проверка будет производиться каждый раз при изменении содержимого текстового поля.

+0

В [учебниках, в разделе «Проверка ввода»] (http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html#inputVerification), они подают звуковой сигнал в InputVerifier. Что в определении InputVerifier заставляет казаться, что вы не должны делать что-то с графическим интерфейсом в нем, особенно с JComponent, к которому имеет доступ InputVerifier? –

+0

Хорошая точка, и хотя описание 'shouldYieldFocus' просто говорит:« calls verify(), чтобы убедиться, что вход действительно », он упоминает, что метод может иметь побочные эффекты.Но я все же считаю, что ActionListener лучше подходит, и я думаю, что это решит вашу проблему, когда речь заходит о NumberFormatter. – Bobulous

+0

Вместо этого я рассмотрю использование ActionListener, но это похоже на странное поведение. Я подтвердил, что в файле verify() текст входного аргумента действительно является значением перед форматированием. Наверное, я просто ожидал, что форматировщик будет вызываться перед верификатором, чтобы вы проверяли форматированный ввод (например, против регулярного выражения, как я делаю). –