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、テキストが変更されたので your を呼び出します。そしてまた...うんざり

于 2014-10-31T11:44:44.490 に答える
1

String.endsWithStringメソッドの呼び出しの最後に渡されたものが存在するかどうかを確認しStringますが、それはあなたが望んでいることではありません。

これは私がすることです:

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

oldValueしかし、あなたのテストは と の両方で何かをテストするので、私には奇妙に思えますnewValue。あなたが何をしたいのか私がよく理解しているなら、あなたはそれらの2つのうちの1つだけを考えるべきです.

于 2014-10-31T11:44:10.960 に答える
1

Listener を TextField に追加します。次に、メソッドをオーバーライドしますchanged()。このメソッドでは、あなたが呼び出しますsetText()!! これにより、リスナーがchanged()再び呼び出されます....そのため、無限ループに陥ります...

于 2014-10-31T11:46:07.637 に答える