java - 控制键盘输入到 javafx TextField

标签 java javafx

我想控制 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();
            }
        }
    };
}    
/*****************************************************************************************/

祝你好运。

关于java - 控制键盘输入到 javafx TextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167750/

相关文章:

JavaFX/TreeTableView : Relationship between Selection and Focus

java - Java 可以处理多少个音频片段?

java - 图像比较技术与 Java

JavaFX 按钮对第二次单击而不是第一次单击使用react

unit-testing - 使用 JavaFx 和 TestFx 进行 headless 测试

java - 运行 JavaFX Gradle 应用程序时出现 NoClassDefFoundError StringUtils 或 Gson

java - 如何使图表焦点中的节点可遍历?

java - 解决点和线问题的算法?

java - Google App Engine Connected Android (Eclipse) 设备端点错误

java - 检索多个子分支 Firebase