2014-10-31 212 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() ....所以你最終在一個無限循環...

相關問題