我想在逗号上检查我输入的字符串,这很简单(只使用它:How can I check if a single character appears in a string?)。现在我想检查一个角色是否存在多次。 (在这种情况下是一个逗号(/ 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错误,因为它似乎无法退出循环。谁能解释为什么它不能?
注意:我知道有更多方法可以检查多个角色,但我很好奇为什么这会给我一个错误。
非常感谢任何帮助!
答案 0 :(得分:2)
想象一下你在编辑一个逗号中结束的字符串的情况(实际上,这很可能是你所处的情况)。当您更改该字符串中的其他内容时,您的if
语句(if (oldValue.contains("\u002C") && newValue.endsWith("\u002C"))
)会返回true
并尝试通过调用tf.setText()
但是 - 这会改变文字!并再次调用ChangeListener
。新值以逗号结尾(您将恢复为以逗号结尾的值),旧值也包含逗号,因此您的侦听器再次调用tf.setText()
。
之后,它会调用您的ChangeListener
,因为文本已更改。再次...... ad nauseum
答案 1 :(得分:1)
String.endsWith
检查调用该方法的String
末尾是否存在String
,但这不是您愿意做的。
这就是我要做的事情:
int index = myString.indexOf(ch);
boolean moreThanOnce = index != -1 && index != myString.lastIndexOf(ch);
然而,你的测试对我来说似乎很奇怪,因为它在oldValue
和newValue
上测试了一些东西。如果我很清楚你想做什么,你应该只考虑其中的一个。
答案 2 :(得分:1)
您将一个监听器添加到TextField。然后重写changed()
方法。在这种方法中,你打电话给setText()
!!这将再次调用听众'changed()
....所以你最终会陷入无限循环......