JavaFX:拥有最多2个字符的文本字段。。。无法替换所有标记的字符
在MyTextFieldMaxLength2中键入时: “1”标记并单击数字9=>将被替换='9'。。。好啊 b'12'标记并单击数字9=>什么都没有发生 即使这两个数字都被标记了,我怎么能得到它呢?这两个数字都被一个新的数字替换了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
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一次,然后才能在应用程序中的任何位置使用它们。这就是它的工作原理。非常感谢。