【问题标题】:JavaFX checking if Event's KeyCode is a digit keyJavaFX 检查事件的 KeyCode 是否为数字键
【发布时间】:2018-01-06 14:24:00
【问题描述】:

我正在创建一个自定义文本字段类,其中我有一个自定义行为,具体取决于用户是否在其上键入数字键。

!event.getCode().isDigitKey() 总是返回 true,即使我输入数字也是如此。我试图检查 KeyCode 是否也是一个字母,但它仍然返回 false。这里似乎有什么问题?

在检查 事件的 KeyCode 与任何 其他 KeyCode 时,我总是得到错误,即使它们应该相等。

public class ScoreField extends TextField implements Customizable {

public ScoreField() {
    super();
    customize();
}

@Override
public void customize() {
    this.setOnKeyTyped(new EventHandler<KeyEvent>() {
        int curChar = 0;

        @Override
        public void handle(KeyEvent event) {
            event.consume();
            KeyCode keyTyped  = event.getCode();
            char    charTyped = event.getCharacter().charAt(0);

            System.out.println(charTyped);

            // Do nothing if not a digit
            if (!event.getCode().isDigitKey()) {
                System.out.println("NOT A DIGIT KEY");
                if (keyTyped == KeyCode.BACK_SPACE) {
                    System.out.println("RESETTING");
                    resetText();
                    return;
                }
                return;
            }

            if (getText().length() >= 5) {
                if (curChar == 2) {
                    curChar = 3;
                }
                if (curChar == 5) {
                    curChar = 0;
                }
                StringBuilder builder = new StringBuilder(getText());
                builder.setCharAt(curChar, charTyped);
                setText(builder.toString());
                curChar++;
                return;
            }
            if (getText().length() == 2) {
                setText(getText() + ":");
            }
            setText(getText() + charTyped);
        }
    });
}

private void resetText() {
    setText("");
}

}

【问题讨论】:

  • documentation。对于键类型事件,代码始终为KeyCode.UNDEFINED。使用getCharacter() 并使用字符串方法检查它是否是数字,或者使用按键事件。
  • 我可能根本不会为此使用事件处理程序,fwiw,但会使用 TextFormatter 代替(我想取决于您的“特殊行为”的确切性质)。跨度>
  • 我更新了代码以包含该行为。我不认为 TextFormatter 会做我的工作,看看它的文档。
  • 我想我现在只需要一个 if (("" + charTyped).matches("[0-9]")) 来解决问题,因为键码始终是未定义的。
  • 为什么不if (Character.isDigit(charTyped))

标签: java javafx javafx-8 javafx-2


【解决方案1】:

正如 James_D 所说:

对于按键类型的事件,代码始终为 KeyCode.UNDEFINED

所以我按照他的建议做了,我没有检查 KeyCode 是否是数字,而是在第一个 if 语句中使用 Character.isDigit(char) 检查了 event.getCharacter()[0],它非常适合我的情况。

P.S:我尝试将 TextFormatter 与 StringConverter 一起使用,但无法正常工作。

【讨论】:

  • James_D 没有建议使用TextFormatter 的转换器来做到这一点,但the filter 允许您在修改TextField 的文本之前修改输入的结果。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多