Scala Swing: проверка целочисленного ввода для текстового поля

У меня есть TextField, из которого я хочу получить целочисленный ввод. В предыдущей версии C# Wpf я подписываюсь на PreviewTextInput следующим образом:

private void PrevInp(object sender, TextCompositionEventArgs e)
{
   int temp;
   if (!(int.TryParse(e.Text, out temp)))
      e.Handled = true;
   else
      if (TextAltered == false)
      {
         inp.Text = "";
         TextAltered = true;
      }
}

Надеюсь, я смогу сделать что-нибудь почище в Scala. Я вижу, вы можете установить функцию для inputVerifier, но inputVerifier вызывается только тогда, когда TextField теряет фокус.

Я могу использовать событие KeyTyped следующим образом:

val intF = new TextField(defInt.toString, 5)
{
   inputVerifier = myV _
   listenTo(keys, this)
   reactions += { case e: KeyTyped => text = text.filter(_.isDigit)}

   def myV(v: Component ): Boolean = text.forall(_.isDigit) 

}

Но новая нажатая клавиша добавляется после применения фильтра.

1 ответ

Решение

Ответ заключается в использовании event.consume следующим образом

val intF = new TextField(defInt.toString, 5)
{
   inputVerifier = myV _
   listenTo(keys)
   reactions +=
   {
      case e: KeyTyped =>     
      {
         if (!e.char.isDigit)
            e.consume           
      }
   }
}
Другие вопросы по тегам