一些背景故事。我正在使用textformatting将输入过滤到文本字段中。我只有一个用于数字,一个用于字母数字字符,一个用于带小数的数字。这应该只是字母,只匹配“true”或“false”不区分大小写。我下面的代码只允许键入这些字母,这是我想要的功能,但它不会按顺序匹配。
UnaryOperator<TextFormatter.Change> filterBoolean = (TextFormatter.Change t) -> {
if (t.isReplaced()) {
if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) {
t.setText(t.getControlNewText().substring(t.getRangeStart(), t.getRangeEnd()));
}
} else if (t.isAdded()) {
if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) {
t.setText("");
} else if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) {
t.setText("");
}
}
return t;
};
getTextField().setTextFormatter(new TextFormatter<>(formatter));
我尝试通过将它们分开添加
来使用此功能|| t.getControlNewText().matches("[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]")
|| t.getControlNewText().matches("[^([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])]")
|| t.getControlNewText().matches("^([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])")
到每个t.getText()行,但它似乎不起作用。 我有类似的文本格式化程序,允许任何字母数字字符最多X次,但那些不是对顺序敏感的。
所以我的问题是,如何编辑我的代码以允许文本字段的顺序敏感输入,我只想匹配“true”和“False”,不区分大小写?
答案 0 :(得分:2)
如评论中所述,您几乎肯定会考虑为此使用不同的控件,例如复选框或其他类型的切换按钮。
如果你想走这条路,你需要考虑在用户还在编辑时有效的(不仅仅是在编辑完成时)。所以,例如用户可能会从文本"true"
或"false"
中的任何位置删除。可以想象,在删除"true"
之前,他们也可能会开始输入"false"
。
所以你可能想要像
这样的东西UnaryOperator<TextFormatter.Change> filterBoolean = (TextFormatter.Change t) -> {
String testText = t.getControlNewText().toLowerCase();
if ("truefalse".contains(testText) || "falsetrue".contains(testText)) {
return t ;
}
// otherwise veto:
return null ;
};
如果你想要更加严格(但可能对用户来说更烦人),你可以if ("true".contains(testText) || "false".contains(testText))
等等。你可能会更加复杂,例如如果有任何删除操作,您可以删除所有文本(因为这可能是用户的意图)。
在任何一种情况下,您都需要在用户提交时进行额外验证(可能是在按 Enter 或失去键盘焦点时)。
同样,使用专门为此用例设计的控件,这是一种更好的用户体验。