Cannot listen to KeyEvent in JavaFX
Asked Answered
S

3

8

I want my JavaFX program to respond to keyboard events.
I tried adding listeners to root Pane, to topmost Pane, but it doesn't respond to events!
Here is my code:

   AnchorPane root = new AnchorPane();
   root.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent t) {
            pressKey(t.getCharacter().charAt(0));
        }
    });
    root.setOnKeyReleased(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent t) {
            releaseKey(t.getCharacter().charAt(0));
        }
    });
    root.addEventHandler(EventType.ROOT, new EventHandler<Event>() {

        @Override
        public void handle(Event t) {
            if (t.getClass().equals(KeyEvent.class)) {
                System.out.println("AAARGH! " + ((KeyEvent)t).getCharacter());
            }
        }
    });

WHY U NO WORKING, key events? Am I doing something wrong here?
To be sure, mouse events works fine with the same code.

Skip answered 30/5, 2013 at 11:30 Comment(1)
Add listener on scene?Defrayal
D
14

One solution is to add an event listener to the scene. Because layouts don't have focus by default, so they don't respond on KeyEvents. KeyEvents are passed to the focused node first.

Another solution is to make your pane focusable:

root.setFocusTraversable(true)
Defrayal answered 30/5, 2013 at 11:52 Comment(1)
I added a SplitPane with one Node inside. Worked fine then. Wouldn't work with a BorderPane, even though I setFocusTraversable(true)...not sure why the difference.Casaubon
R
1

((KeyEvent)t).getCharacter() instead use ((KeyEvent)e).getText()

Radioman answered 13/7, 2017 at 19:39 Comment(0)
P
-1

also make sure you are importing the correct KeyEvent as in

import javafx.scene.input.KeyEvent;

rather than the KeyEvent from awt

Psychrometer answered 20/7, 2015 at 3:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.