JavaFXTextField-只允许键入一个字母

JavaFXTextField-只允许键入一个字母,java,user-interface,javafx,textfield,Java,User Interface,Javafx,Textfield,我正在尝试用JavaFX制作一个数独游戏,但我不知道如何只允许输入一个字母。答案是调用textfield并执行以下操作: myTextField.setOnKeyPressed(e-> { 如果(!myTextField.getText().length().isEmpty()) { //以某种方式拒绝按键? } } 上述方法不适用于复制粘贴…或大量其他事情等。像这样使用按键侦听器似乎是个糟糕的主意。一定有更好的方法吗?文本字段是否有只允许输入特定字符的属性,或者只允许输入特定数量的字符 谢谢

我正在尝试用JavaFX制作一个数独游戏,但我不知道如何只允许输入一个字母。答案是调用textfield并执行以下操作:

myTextField.setOnKeyPressed(e->
{
如果(!myTextField.getText().length().isEmpty())
{
//以某种方式拒绝按键?
}
}
上述方法不适用于复制粘贴…或大量其他事情等。像这样使用按键侦听器似乎是个糟糕的主意。一定有更好的方法吗?文本字段是否有只允许输入特定字符的属性,或者只允许输入特定数量的字符

谢谢!

您可以使用来执行此操作。
TextFormatter
可以修改对文本字段中的文本所做的更改,如果它有一个相关联的筛选器。筛选器是一个函数,它接受一个
TextFormatter.Change
对象并返回一个相同类型的对象。它可以返回
null
以否决该命令完全更改或修改它

所以你可以

TextField textField = new TextField();
textField.setTextFormatter(new TextFormatter<String>((Change change) -> {
    String newText = change.getControlNewText();
    if (newText.length() > 1) {
        return null ;
    } else {
        return change ;
    }
});

看看这个Q/a:请注意,如果用户使用鼠标和上下文菜单进行复制和粘贴,那么使用侦听器进行按键将失败。链接问题中接受的答案也有缺陷;其他答案也可以,但已经过时,因为JavaFX 8有一个专门用于此用例的API。哇,它确实工作得很好。我认为会有这不是一个倾听者,谢谢!
    TextField textField = new TextField();

    // converter that converts text to Integers, and vice-versa:
    StringConverter<Integer> stringConverter = new StringConverter<Integer>() {

        @Override
        public String toString(Integer object) {
            if (object == null || object.intValue() == 0) {
                return "";
            }
            return object.toString() ;
        }

        @Override
        public Integer fromString(String string) {
            if (string == null || string.isEmpty()) {
                return 0 ;
            }
            return Integer.parseInt(string);
        }

    };

    // filter only allows digits, and ensures only one digit the text field:
    UnaryOperator<Change> textFilter = c -> {

        // if text is a single digit, replace current text with it:            
        if (c.getText().matches("[1-9]")) {
            c.setRange(0, textField.getText().length());
            return c ;
        } else 
        // if not adding any text (delete or selection change), accept as is    
        if (c.getText().isEmpty()) {
            return c ;
        }
        // otherwise veto change
        return null ;
    };

    TextFormatter<Integer> formatter = new TextFormatter<Integer>(stringConverter, 0, textFilter);

    formatter.valueProperty().addListener((obs, oldValue, newValue) -> {
        // whatever you need to do here when the actual value changes:
        int old = oldValue.intValue();
        int updated = newValue.intValue();
        System.out.println("Value changed from " + old + " to " + new);
    });

    textField.setTextFormatter(formatter);