我正在尝试在文本字段上使用过滤器。问题是我得到了一个例外:
java.lang.StackOverflowError at
com.sun.javafx.collections.ObservableListWrapper.size(ObservableListWrapper.java:335)
我无法理解为什么会抛出异常,因为我有类似的代码并且没有StackOverflowError。我认为setText()一次又一次地调用监听器,但为什么我之前没有出现类似代码的错误?
public static void addNumericFilter(final TextField tf) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> value, String oldValue, String newValue) {
//System.out.println("text = " + tf.getText());
System.out.println("value = " + value.getValue());
System.out.println("oldValue = " + oldValue);
System.out.println("newValue = " + newValue);
try {
Integer.parseInt(value.getValue());
} catch (NumberFormatException ex) {
tf.setText(oldValue);
}
}
});
}
这段代码完美无缺,例如(为什么这里没有堆栈溢出?):
public static void addUpperCaseFilter(final TextField tf) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> value, String oldValue, String newValue) {
tf.setText(value.getValue().toUpperCase());
}
});
}