我想将输入控制在一个
Javafx TextField中,以便我只能允许数字输入,所以如果超过最大字符,那么文本框不会有任何改变.
编辑:根据评论中的建议,我使用JavaFX项目负责人建议的方法.停止输入信件非常有用.我只需要它也可以过滤特殊字符.我尝试将过滤器更改为(text.matchs(“[0-9]”),但不允许输入退格.
edit2:形成一个特殊字符和长度的过滤器.这是我的最终代码感谢您的投入.
这是我创建的TextField类:
import javafx.scene.control.TextField; public class AttributeTextField extends TextField{ public AttributeTextField() { setMinWidth(25); setMaxWidth(25); } public void replaceText(int start,int end,String text) { String oldValue = getText(); if (!text.matches("[a-z]") && !text.matches("[\\\\!\"#$%&()*+,./:;<=>?@\\[\\]^_{|}~]+")) { super.replaceText(start,end,text); } if (getText().length() > 2 ) { setText(oldValue); } } public void replaceSelection(String text) { String oldValue = getText(); if (!text.matches("[a-z]") && !text.matches("[\\\\!\"#$%&()*+,./:;<=>?@\\[\\]^_{|}~]+")) { super.replaceSelection(text); } if (getText().length() > 2 ) { setText(oldValue); } } }
注意:我已经阅读了What is the recommended way to make a numeric TextField in JavaFX?这篇文章,这个解决方案对我来说不起作用.数字输入后才会触发.意思是有人可以在框中输入字母文字,并允许它直到将焦点从文本框移开.此外,他们可以输入大于允许的数字,但验证不是在每个按键上发生,而是在焦点移动(“更改”事件)之后.
解决方法
最好的办法是:
@FXML private TextField txt_Numeric; @FXML private TextField txt_Letters; @Override public void initialize(URL url,ResourceBundle rb) { /* add Event Filter to your TextFields **************************************************/ txt_Numeric.addEventFilter(KeyEvent.KEY_TYPED,numeric_Validation(10)); txt_Letters.addEventFilter(KeyEvent.KEY_TYPED,letter_Validation(10)); } /* Numeric Validation Limit the characters to maxLengh AND to ONLY DigitS *************************************/ public EventHandler<KeyEvent> numeric_Validation(final Integer max_Lengh) { return new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent e) { TextField txt_TextField = (TextField) e.getSource(); if (txt_TextField.getText().length() >= max_Lengh) { e.consume(); } if(e.getCharacter().matches("[0-9.]")){ if(txt_TextField.getText().contains(".") && e.getCharacter().matches("[.]")){ e.consume(); }else if(txt_TextField.getText().length() == 0 && e.getCharacter().matches("[.]")){ e.consume(); } }else{ e.consume(); } } }; } /*****************************************************************************************/ /* Letters Validation Limit the characters to maxLengh AND to ONLY Letters *************************************/ public EventHandler<KeyEvent> letter_Validation(final Integer max_Lengh) { return new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent e) { TextField txt_TextField = (TextField) e.getSource(); if (txt_TextField.getText().length() >= max_Lengh) { e.consume(); } if(e.getCharacter().matches("[A-Za-z]")){ }else{ e.consume(); } } }; } /*****************************************************************************************/
最好的运气.