0

我想用逗号检查我输入的字符串,这很容易(只是使用了这个:如何检查单个字符是否出现在字符串中?)。现在我想检查一个角色是否不止一次出现。(在本例中为逗号 (/u002C))我创建了以下代码:

public static void addTextLimiterDouble(final TextField tf, final int maxLength, final Button submitButton) {
    tf.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {

            if (oldValue.contains("\u002C") && newValue.endsWith("\u002C")) {
                tf.setText(oldValue);
            }
    }
});

这会产生 StackOverflow 错误,因为它似乎无法脱离循环。谁能解释为什么不能?

注意:我知道可能有更多方法可以检查多个字符,但我只是好奇为什么这会给我一个错误。

任何帮助是极大的赞赏!

4

3 回答 3

2

想象一下您正在编辑以逗号结尾的字符串的情况(实际上,这很可能是您所处的情况)。当您更改该字符串中的其他内容时,您的if语句 ( if (oldValue.contains("\u002C") && newValue.endsWith("\u002C"))) 返回true并且您尝试通过调用恢复到旧值tf.setText()

然而——这改变了文本!你ChangeListener的再次被调用。新值以逗号结尾(您正在恢复为以逗号结尾的值)并且旧值也包含逗号,因此您的侦听器再次调用tf.setText().

之后,它会调用您的,ChangeListener因为文本已更改。又一次……令人作呕

于 2014-10-31T11:44:44.490 回答
1

String.endsWith检查String在调用方法结束时是否存在传递String,但这不是您愿意做的。

这就是我要做的:

int index = myString.indexOf(ch);
boolean moreThanOnce = index != -1 && index != myString.lastIndexOf(ch);

但是,您的测试对我来说似乎很奇怪,因为它在 和 上都测试了一些oldValue东西newValue。如果我理解你想要做什么,你应该只考虑这两者之一。

于 2014-10-31T11:44:10.960 回答
1

You add a Listener to your TextField. Then you override the changed() method. In this method you call setText() !! This will invoke the Listeners' changed() again .... so you end up in an infinite loop ...

于 2014-10-31T11:46:07.637 回答