2013-05-30 34 views
8

Tôi muốn chương trình JavaFX của mình phản hồi các sự kiện bàn phím.
Tôi đã thử thêm người nghe vào thư mục gốc Pane, lên trên cùng Pane, nhưng nó không phản hồi sự kiện!
Đây là mã của tôi:Không thể nghe KeyEvent trong 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()); 
      } 
     } 
    }); 

TẠI SAO U KHÔNG LÀM VIỆC, các sự kiện quan trọng? Tôi có làm gì sai ở đây không?
Để đảm bảo, các sự kiện chuột hoạt động tốt với cùng mã.

+1

Thêm người nghe trên sân khấu? –

+0

cảm ơn, hoạt động. – Chechulin

Trả lời

11

Một giải pháp là thêm trình xử lý sự kiện vào cảnh. Do bố cục không được tập trung theo mặc định nên chúng không phản hồi trên KeyEvents. KeyEvents được chuyển đến nút được tập trung đầu tiên.

Một giải pháp khác là làm cho khung thể đặt tiêu điểm của bạn:

root.setFocusTraversable(true) 
+0

Tôi đã thêm một SplitPane với một nút bên trong. Làm việc tốt rồi. Sẽ không làm việc với một BorderPane, mặc dù tôi setFocusTraversable (true) ... không chắc chắn lý do tại sao sự khác biệt. –

0

cũng chắc chắn rằng bạn đang nhập khẩu các KeyEvent đúng như trong javafx.scene.input.KeyEvent

nhập khẩu;

chứ không phải là KeyEvent từ AWT

1

((KeyEvent)t).getCharacter() thay vì sử dụng ((KeyEvent)e).getText()