我正在尝试使用JavaFX 8的TextFormatter为整数创建一个数字TextField。
使用一元运算符的解:
UnaryOperator<Change> integerFilter = change -> {
String input = change.getText();
if (input.matches("[0-9]*")) {
return change;
}
return null;
};
myNumericField.setTextFormatter(new TextFormatter<String>(integerFilter));
使用整数字符串转换器的解决方案:
myNumericField.setTextFormatter(new TextFormatter<>(new IntegerStringConverter()));
这两种解决方案都有各自的问题。使用UnaryOperator时,我只能像预期的那样输入0到9的数字,但我也需要输入负值,如“-512”,其中符号只允许在第一个位置。此外,我不希望像“00016”这样的数字仍然是可能的。
IntegerStringConverter方法的效果要好得多:所有无效的数字,如“-16-123”都不会被接受,而像“0123”这样的数字会被转换为“123”。但是,只有当文本被提交(通过按Enter键)或TextField失去焦点时,才会发生转换。
是否有办法在每次更新TextField的值时使用IntegerStringConverter强制执行第二个方法的转换?
4条答案
按热度按时间bt1cpqcv1#
转换器与滤波器不同:转换器指定如何将文本转换为值,而过滤器过滤用户可能做出的更改。2听起来好像两者都需要,但您希望过滤器更准确地过滤允许的更改。
我发现如果修改被接受,检查文本的新值通常是最容易的。你想有一个可选的
-
,后面跟着1-9
,后面有任意数量的数字。允许一个空字符串是很重要的,否则用户将无法删除所有内容。所以你可能需要
你甚至可以给过滤器添加更多的功能,让它以更智能的方式处理
-
,例如:这将允许用户在任意点按
-
,并切换整数的符号。学校:
教程
有关使用
TextFormatter
的综合教程指南:ltskdhd12#
是否有办法在每次更新TextField的值时使用IntegerStringConverter强制执行第二个方法的转换?
虽然@James_D的答案给出了你想要的答案,但我还想添加一个不同的视角。你的想法是握住用户的手,每按一个键。这可能很有帮助,但也可能让用户感到沮丧。像复制粘贴到文本字段,或在不同位置编辑现有输入这样的操作,并不能很好地与握住的方法一起工作。
您可能希望立即应用转换/筛选的原因是,用户可能不知道输入无效,并且可能在切换到下一个字段时错过了更正。因此,与限制用户可以输入的内容不同,您可以直观地显示当前输入是否有效,而无需更改文本内容。例如,当内容无效时,你可以在文本域中添加红色边框。2除此之外,你还可以使用字符串转换器。
例如
转换器也可以很容易地扩展到限制有效数字范围。
kjthegm63#
iqjalb3h4#
下面是我的解决方案: