JavaFX:拥有最多2个字符的文本字段。。。无法替换所有标记的字符

JavaFX:拥有最多2个字符的文本字段。。。无法替换所有标记的字符,javafx,textfield,Javafx,Textfield,在MyTextFieldMaxLength2中键入时: “1”标记并单击数字9=>将被替换='9'。。。好啊 b'12'标记并单击数字9=>什么都没有发生 即使这两个数字都被标记了,我怎么能得到它呢?这两个数字都被一个新的数字替换了 public class MyTextFieldMaxLength2 extends TextField { public boolean ifCondition_validate(String text) { return (getTex

在MyTextFieldMaxLength2中键入时: “1”标记并单击数字9=>将被替换='9'。。。好啊 b'12'标记并单击数字9=>什么都没有发生

即使这两个数字都被标记了,我怎么能得到它呢?这两个数字都被一个新的数字替换了

public class MyTextFieldMaxLength2 extends TextField {

    public boolean ifCondition_validate(String text) {
        return (getText().length() < 2 || text.equals("")) && text.matches("[0-9]*");
    }


    @Override
    public void replaceText(int start, int end, String text) {
        if ( ifCondition_validate(text) ) {
            super.replaceText(start, end, text);
        }       
    }   

    @Override
    public void replaceSelection(String text) {
        if ( ifCondition_validate(text) ) {
            super.replaceSelection(text);
        }
    }
}

通过在标准文本字段上设置TextFormatter,而不是对文本字段进行子类化,您可以轻松做到这一点:

TextField textField = new TextField();

UnaryOperator<TextFormatter.Change> filter = c -> {
    String proposedText = c.getControlNewText();
    if (proposedText.matches("[0-9]{0,2}")) {
        return c ;
    } else {
        return null ;
    }
};
textField.setTextFormatter(new TextFormatter<String>(filter));

首先,感谢您提供的解决方案。我正在使用SceneBuilder开发一个大型图形应用程序。我喜欢自己的TextField类的概念,这些类具有要构建的特殊属性,然后统一使用SceneBuilder。我希望可以在MyTextFieldMaxLength2类中直接找到解决问题的方法,这样就可以在派生的TextField类中清晰地绑定该功能。我再等几天也许有人有主意。在另一种情况下,我接受你的解决方案。再次感谢。@Sten为什么不在文本字段子类中使用此解决方案?我放弃了使用文本字段子类的想法。我坚持您的直接方法,只将filter方法作为静态方法。因此,我必须使用过滤方法,例如只过滤x2个数字,只过滤0xor1xcomma一次,然后才能在应用程序中的任何位置使用它们。这就是它的工作原理。非常感谢。