我有一个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)
}
但按下的新键是在应用过滤器后添加的。
答案是使用event.cosume,如下
val intF = new TextField(defInt.toString, 5)
{
inputVerifier = myV _
listenTo(keys)
reactions +=
{
case e: KeyTyped =>
{
if (!e.char.isDigit)
e.consume
}
}
}