JavaFX KeyTyped事件与KeyPressed和KeyReleased事件冲突

时间:2014-06-02 03:47:24

标签: java javafx keyevent typed

    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            if (ke.getCode() == KeyCode.SPACE) {
                System.out.println("space pressed");
            }
        }
    });
    scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            if (ke.getCode() == KeyCode.SPACE) {
                System.out.println("space released");
            }
        }
    });
    scene.setOnKeyTyped(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            if (ke.getCode() != KeyCode.SPACE) {
                System.out.println("typed");
            }
        }
    });

JavaFX KeyTyped事件与KeyPressed和KeyReleased事件冲突。

为什么我按空格键,也打印“键入”,这很奇怪。

谢谢!

1 个答案:

答案 0 :(得分:2)

引用Java Documentation

  

“键入类型”事件是更高级别的,通常不依赖于   平台或键盘布局。它们是在Unicode时生成的   输入字符,是了解的首选方式   字符输入。在最简单的情况下,生成键类型事件   通过单键按压(例如,'a')。然而,通常,角色是   由一系列按键(例如,SHIFT +'a')产生,以及映射   从按键事件到关键类型事件可以是多对一或   许多到很多。生成密钥通常不需要密钥发布   键入的事件,但在某些情况下,键入的事件不是   生成直到密钥被释放(例如,通过输入ASCII序列)   Windows中的Alt-Numpad方法)。不会生成任何键类型事件   对于不生成Unicode字符的键(例如,操作键,   修饰键等。)。

     

char变量始终包含有效的Unicode字符或   CHAR_UNDEFINED。键输入事件报告字符输入;键   按下和键释放事件不一定与   字符输入。因此,char变量保证是   仅对键入事件有意义。

     

对于按键和键释放事件,代码变量包含   事件的关键代码。对于键类型事件,始终是代码变量   包含KeyCode.UNDEFINED。

     

“按下按键”和“按键释放”事件是较低级别依赖的   平台和键盘布局。只要一个键,就会生成它们   按下或释放,是了解密钥的唯一方法   不生成字符输入(例如,动作键,修饰键,   等等。)。按下或释放的键由代码指示   变量,包含虚拟键码。

基本上说,“按键式”事件是输入事件,而“按下按键”和“按键发布”事件是键盘事件。