当前位置: 首页 > 知识库问答 >
问题:

JavaFX TextField-只允许输入一个字母

司知
2023-03-14
myTextField.setOnKeyPressed(e ->
{
    if (!myTextField.getText().length().isEmpty())
    {
        // Somehow reject the key press?
    }
}

共有1个答案

仲孙默
2023-03-14

您可以使用TextFormatter来执行此操作。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 ;
    }
});

但是请注意,TextFormatter也可以用于将文本转换为您喜欢的任何类型的值。在您的示例中,将文本转换为整数是有意义的,并且只允许整数输入。作为对用户体验的最后补充,您可以修改更改,以便如果用户键入一个数字,它将替换当前内容(而不是在字符太多时忽略它)。整件事看起来是这样的:

    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 " + updated);
    });
    
    textField.setTextFormatter(formatter);
 类似资料:
  • 问题内容: 我正在尝试用JavaFX制作数独游戏,但我不知道如何只允许输入一个字母。对此的答案是调用文本字段并执行以下操作: 上面的方法不适用于复制粘贴…或大量其他事情,等等。像这样使用按键监听器似乎是一个AWFUL想法。一定有更好的东西吗?是否存在文本字段的属性,仅允许输入某些字符,或仅允许输入一定数量的字符? 谢谢! 问题答案: 您可以使用来执行此操作。该可以修改都在文本字段做,如果有一个与之

  • 我有一个输入字段,用户只能在其中输入数字。 JSFIDLE演示 问题是:当我输入一个数字(例如,)然后按点()时,或-浏览器会自动删除输入字段的内容(值设置为“”=空字符串)。但是为什么呢?将类型从更改为似乎可以解决问题。但是,我失去了输入字段的向上/向下箭头功能。有什么想法吗?

  • 问题内容: 我是angularjs的新手。我想知道什么是只允许在文本框中键入有效数字的方法。例如,用户可以键入“ 1.25”,但不能键入“ 1.a”或“ 1 ..”。当用户尝试输入下一个将使它成为无效数字的字符时,他将无法输入。 提前致谢。 问题答案: 您可以尝试使用此指令来阻止将任何无效字符输入到输入字段中。( 更新 :这依赖于对模型具有明确知识的指令,这对于可重用性而言并不理想,请参见下面的可

  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • 问题内容: 有没有一种快速的方法来将HTML文本输入()设置为仅允许数字键击(加’。’)? 问题答案: 注意: 这是更新的答案。下面的注释指的是一个旧版本,其中充斥着密钥代码。 JavaScript 您可以使用以下功能过滤文本的输入值(支持CopyPaste,Drag+Drop,键盘快捷键,上下文菜单操作,不可键入的键,插入标记的位置,不同的键盘布局以及IE9以后的所有浏览器 : 现在,您可以使用

  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu