我有一个文本字段,它的输入数据应该是16位数,并且在第4,第8,第12位数字后应该输入空格,我写了这段代码,当我添加第二个内部条件时,程序有堆栈溢出错误,什么我该怎么办?问题是什么?请帮忙。 这是我的代码,我使用change listener:
cardNumberField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov, String t, String t1){
if (t1.length() > 0) {
String s = null;
s = t1.substring(t1.length() - 1,t1.length());
if (!s.matches("\\d") || t1.length() > 19) {
cardNumberField.setText(t);
}
if(t1.length() == 4 || t1.length() == 9 || t1.length() == 14){
cardNumberField.setText(t1 + " ");
}
}
}
});
答案 0 :(得分:4)
假设您在文本字段中有三个字符(&#34; 123&#34;)并键入第四个字符,这是一个数字,例如&#34; 4&#34 ;.当然,这会调用你的听众。
第一个条件为假(因为最后一个字符是数字,长度小于16)。
第二个条件是真的,因为t1.length()==4
。所以你现在调用setText("1234 ")
。
这会更改文本,因此会再次调用您的侦听器。这次第一个条件匹配(因为最后一个字符不是数字)。所以现在你调用setText("1234")
。
这会更改文本,因此会调用您的侦听器。
第一个条件是假(因为最后一个字符是数字,长度小于16)。
第二个条件是真的,因为t1.length()==4
。所以你现在调用setText("1234 ")
。
这会更改文本,因此会再次调用您的侦听器。这次第一个条件匹配(因为最后一个字符不是数字)。所以现在你调用setText("1234")
。
等等。所以你基本上有无限的递归,并且在某些时候(非常快),堆栈不能保持所有的方法调用。
要解决此问题,请修复您的逻辑。防止用户输入无效文本可能会更好,而不是在事后监听并尝试修复它。您可能需要查看this。