【问题标题】:How to match true and false using TextFormatter in java如何在java中使用TextFormatter匹配真假
【发布时间】:2016-09-02 16:52:07
【问题描述】:

一些背景故事。我正在使用文本格式将输入过滤到文本字段中。我有一个只用于数字,一个用于字母数字字符,一个用于带小数的数字。这应该只有字母,并且只匹配“真”或“假”,不区分大小写。我下面的代码将只允许输入那些字母,这是我想要的功能,但它不会按顺序匹配。

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”,为什么不直接使用复选框、单选按钮或切换按钮?
  • 您可以将文本转换为小写字母。另外,如果您打算从String 获取此信息,我不确定为什么不能只使用Boolean.parseBoolean(someString)
  • 文本字段被动态添加到编辑器中,但这是个好主意。
  • 为此使用正则表达式非常过分。只需手动检查字符串。
  • @James_D 公平点。这就是为什么我说我不确定。尽管如此,这是一种非常糟糕的方式来做到这一点。你绝对正确,这应该是一个切换。

标签: java javafx textfield


【解决方案1】:

正如评论中所述,您几乎可以肯定地考虑为此使用不同的控件,例如复选框或其他类型的切换按钮。

如果你想走这条路,你需要考虑在用户仍在编辑时什么是有效的(不仅仅是在编辑完成时)。所以,例如用户可以从文本"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 ;
};

如果你想更严格一些(但可能对用户来说更烦人),你可以做if ("true".contains(testText) || "false".contains(testText))等。你可以更复杂,例如如果有任何删除操作,您可以删除 所有 文本(因为这可能是用户的意图)。

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

同样,使用专门为此用例设计的控件会带来更好的用户体验。

【讨论】:

  • 这正是我需要的。我还是新手,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 2014-04-10
  • 1970-01-01
  • 2014-12-22
  • 2011-10-26
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多