如何在java中使用TextFormatter匹配true和false

如何在java中使用TextFormatter匹配true和false,java,javafx,textfield,Java,Javafx,Textfield,一些背景故事。我使用文本格式将输入过滤到文本字段中。我有一个只用于数字,一个用于字母数字字符,一个用于十进制数字。这应该只包含一个字母,并且只匹配“true”或“false”,不区分大小写。我下面的代码只允许键入这些字母,这是我想要的功能,但它不会按顺序匹配 UnaryOperator<TextFormatter.Change> filterBoolean = (TextFormatter.Change t) -> { if (t

一些背景故事。我使用文本格式将输入过滤到文本字段中。我有一个只用于数字,一个用于字母数字字符,一个用于十进制数字。这应该只包含一个字母,并且只匹配“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.getText()行,但它似乎不起作用。 我有类似的文本格式化程序,允许任何字母数字字符最多X次,但它们不区分顺序


我的问题是,如何编辑我的代码以允许对文本字段的顺序敏感输入,在这里我只想匹配“true”和“false”,不区分大小写,

,如注释中所提到的,您几乎应该考虑使用不同的控件,例如复选框或其他类型的切换按钮。 如果您想走这条路,您需要考虑在用户仍在编辑时(而不仅仅是在编辑完成时)什么是有效的。因此,例如,用户可以从文本中的任何位置删除
“true”
“false”
。可以想象,在删除
“false”
之前,他们也可能开始键入,比如说
“true”

所以你可能想要像这样的东西

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 ;
};
UnaryOperator filterBoolean=(TextFormatter.Change t)->{
String testText=t.getControlNewText().toLowerCase();
if(“truefalse”.contains(testText)| |“false true”.contains(testText)){
返回t;
}
//否则否决:
返回null;
};
如果你想更严格一点(但对用户来说可能更烦人),你可以只做
If(“true”。contains(testText)| |“false”。contains(testText))
,等等。你可以更复杂一些,例如,如果有任何删除操作,你可以删除所有文本(因为这可能是用户的意图)

在任何一种情况下,当用户提交时(可能是按Enter键或键盘失去焦点时),您都需要额外的验证


再次,使用一个专门为这个用例设计的控件是一个更好的用户体验。如注释中所提到的,

,您几乎应该肯定会考虑使用一个不同的控件,例如复选框或其他类型的切换按钮。 如果您想走这条路,您需要考虑在用户仍在编辑时(而不仅仅是在编辑完成时)什么是有效的。因此,例如,用户可以从文本中的任何位置删除
“true”
“false”
。可以想象,在删除
“false”
之前,他们也可能开始键入,比如说
“true”

所以你可能想要像这样的东西

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 ;
};
UnaryOperator filterBoolean=(TextFormatter.Change t)->{
String testText=t.getControlNewText().toLowerCase();
if(“truefalse”.contains(testText)| |“false true”.contains(testText)){
返回t;
}
//否则否决:
返回null;
};
如果你想更严格一点(但对用户来说可能更烦人),你可以只做
If(“true”。contains(testText)| |“false”。contains(testText))
,等等。你可以更复杂一些,例如,如果有任何删除操作,你可以删除所有文本(因为这可能是用户的意图)

在任何一种情况下,当用户提交时(可能是按Enter键或键盘失去焦点时),您都需要额外的验证


再次强调,仅使用专门为此用例设计的控件是一种更好的用户体验。

基本上都是离题的,但我发现很难设想这方面的用例。如果用户应该输入“true”或“false”,为什么不使用复选框、单选按钮或切换按钮呢?首先,您可以将文本转换为小写。另外,我也不知道为什么不能直接使用
Boolean.parseBoolean(someString)
,如果你打算从
String
中获取它。文本字段被动态添加到编辑器中,但这是一个好主意。使用正则表达式来实现这一点是非常过分的。只需手动检查字符串。@James\u D fair point。这就是为什么我说我不确定。尽管如此,这是一种残忍的做法。你完全正确,这应该是一个切换。大部分都是离题的,但我发现很难设想一个这样的用例。如果用户应该输入“true”或“false”,为什么不使用复选框、单选按钮或切换按钮呢?首先,您可以将文本转换为小写。另外,我也不知道为什么不能直接使用
Boolean.parseBoolean(someString)
,如果你打算从
String
中获取它。文本字段被动态添加到编辑器中,但这是一个好主意。使用正则表达式来实现这一点是非常过分的。只需手动检查字符串。@James\u D fair point。这就是为什么我说我不确定。尽管如此,这是一种残忍的做法。你完全正确,这应该是一个切换。这正是我需要它做的。我还是个新手,谢谢你!这正是我需要它做的。我还是个新手,谢谢你!