2013-05-30 2 views
8

Я хочу, чтобы моя программа JavaFX отвечала на события клавиатуры.
Я попытался добавить слушателей к корню Pane, к началу Pane, но он не отвечает на события!
Вот мой код:Не удается прослушать KeyEvent в JavaFX

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()); 
      } 
     } 
    }); 

ПОЧЕМУ U НЕ РАБОЧИЕ, ключевые события? Я здесь что-то не так?
Конечно, события мыши отлично работают с тем же кодом.

+1

Добавить слушателя на сцене? –

+0

спасибо, что работает. – Chechulin

ответ

11

Одним из решений является добавление прослушивателя событий к сцене. Поскольку макеты не имеют фокуса по умолчанию, поэтому они не реагируют на KeyEvents. KeyEvents сначала передаются на сфокусированный узел.

Другим решением является сделать вашу панель фокусирования:

root.setFocusTraversable(true) 
+0

Я добавил SplitPane с одним узлом внутри. Тогда работал хорошо. Не работал бы с BorderPane, хотя я setFocusTraversable (true) ... не знаю, почему разница. –

0

также убедитесь, что вы импортируете правильно KeyEvent как в

импорта javafx.scene.input.KeyEvent;

, а не KeyEvent от AWT

1

((KeyEvent)t).getCharacter() вместо использования ((KeyEvent)e).getText()

Смежные вопросы