StackOverFlow在javafx中使用更改侦听器时出错

时间:2014-04-11 17:31:48

标签: java javafx javafx-2 scenebuilder

我有一个文本字段,它的输入数据应该是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 + " ");
                }
            }
        }
    });

1 个答案:

答案 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