如何将 TextFormatter 附加到 TextField?

How do you attach a TextFormatter to a TextField?

我正在做一个简单的分数 sheet,我正处于让用户创建自定义 sheet 的阶段。显然,我不希望他们随便输入任何整数,所以我试图将我创建的 UnararyOperator 连接到 TextField,但我不确定如何按照我的 JavaFX 项目设置的方式进行操作。

public class MainMenuCtrl {
    @FXML
    private TextField playsFld;

    @FXML
    void initialize() {

        UnaryOperator<TextFormatter.Change> playsValidator = change -> {
            if (change.getText().matches("\d{1,2,3,4,5,6}")){
                return change;
            } else {
                change.setText("");
                change.setRange(change.getRangeStart(), change.getRangeEnd());
                return change;
            }
        };
    }
}

事实证明正则表达式很奇怪而且文档似乎并不总是正确的。玩了一下之后我发现:

"(0*(?:[1-9]?)|10)"

表示 1-10,但只有 1 位数字,除非它特别是 10

"^[1-6]?$"

表示1-6且只有1位数字

"(0*(?:[1-9][0-9]?)|100)"

表示 1-100 最多 3 位,但百位只有 1

*0 匹配前面的字符 0 次。我很确定这就是您锁定位数的方式

?: 表示前面的字符可能不会出现在字符串中。我认为这样就不需要 01.

[n-n] 是搜索的字符。我很确定上面的 [1-9][0-9] 是十位的 1-9 和十位的 0-9。所以你可以为每个地方添加括号。

|用于匹配任何一个元素。所以|100就是精确匹配100。

$是告诉电脑你必须在结束前匹配。