2013-05-30 49 views
8

Chcę, aby mój program JavaFX reagował na zdarzenia klawiatury.
Próbowałem dodać słuchaczy do root Pane, na najwyższy Pane, ale nie reaguje na wydarzenia!
Oto mój kod:Nie można słuchać KeyEvent w 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()); 
      } 
     } 
    }); 

dlaczego u BRAK PRACY, kluczowe wydarzenia? Czy robię coś złego tutaj?
Dla pewności, zdarzenia myszy działają poprawnie z tym samym kodem.

+1

Dodaj słuchacza na scenie? –

+0

dzięki, to działa. – Chechulin

Odpowiedz

11

Jednym z rozwiązań jest dodanie detektora zdarzeń do sceny. Ponieważ układy nie mają domyślnie fokusa, więc nie reagują na KeyEvents. KeyEvents są najpierw przekazywane do skupionego węzła.

Innym rozwiązaniem jest, aby Państwa szyba aktywowana:

root.setFocusTraversable(true) 
+0

Dodałem SplitPane z jednym węzłem w środku. Dobrze wtedy pracował. Nie działałby z ramką BorderPane, nawet jeśli ustawiłem setFocusTraversable (true) ... nie wiem, dlaczego różnica. –

0

również upewnić się, że importujesz właściwą keyEvent jak w

importowej javafx.scene.input.KeyEvent;

zamiast keyEvent od AWT

1

((KeyEvent)t).getCharacter() zamiast wykorzystać ((KeyEvent)e).getText()

Powiązane problemy