2014-10-31 702 views
0

我想用逗号检查我输入的字符串,这很简单(只是使用这个:How can I check if a single character appears in a string?)。现在我想检查一个角色是否存在多次。 (在这种情况下一个逗号(/ u002C))我创造了这个代码:Java:检查字符串是否包含多个字符

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的错误,因为它似乎不能走出循环。任何人都可以解释为什么它不能?

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

任何帮助,非常感谢!

回答

2

想象一下您正在编辑字符串以逗号结尾的情况(实际上,这很可能是您所处的状况)。当您更改别的东西在该字符串,那么你的if声明(if (oldValue.contains("\u002C") && newValue.endsWith("\u002C")))返回true并尝试通过调用tf.setText()

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

之后,它会调用您的ChangeListener,因为文本已更改。再次... 广告恶心

+0

谢谢你这个伟大的解释!我认为ChangeListener只会被用户调用文本框中的文本,但这显然不是真的。 – bashoogzaad 2014-10-31 12:00:29

1

String.endsWith检查通过的String是否存在于调用该方法的String的末尾,但这不是您愿意做的。

这是我会做:

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

但是你的测试似乎怪我,因为它测试两个oldValuenewValue东西。如果我很好地理解你想做什么,你应该只考虑其中的一个。

+0

谢谢你的解释,并为你的替代这一点。它完美的作品! – bashoogzaad 2014-10-31 12:05:23

1

您将一个监听器添加到您的TextField中。然后您覆盖changed()方法。在这种方法中,您可以拨打setText()!这将再次调用听众'changed() ....所以你最终在一个无限循环...

相关问题