2017-03-02 95 views
-1

我想添加一个KeyEvent事件处理程序到我的JavaFX窗口,但当我尝试将它添加到primarystage或primaryscene时出现错误。JavaFX窗口KeyEvent

我该如何去添加eventhandler到窗口?

我的处理程序

EventHandler<KeyEvent> handler = event -> { 
    switch (event.getCode()) { 
     case UP: 
      System.out.println("up"); 
      break; 
     case DOWN: 
      System.out.println("down"); 
      break; 
     case LEFT: 
      System.out.println("left"); 
      break; 
     case RIGHT: 
      System.out.println("right"); 
      break; 
    } 
}; 

它添加到现场

mainScene.addEventHandler(EventType.ROOT, handler); 

错误:

Error:(75, 18) java: method addEventHandler in class javafx.scene.Scene cannot be applied to given types; required: javafx.event.EventType,javafx.event.EventHandler
found: javafx.event.EventType,javafx.event.EventHandler reason: inference variable T has incompatible bounds equality constraints: javafx.event.Event upper bounds: javafx.scene.input.KeyEvent,javafx.event.Event

+0

[编辑]你的问题,以显示你如何试图添加这个处理程序的场景。你得到什么错误? –

+0

编辑帖子 – Lithicas

回答

1

你的处理程序是一个EventHandler<KeyEvent>:也就是说,它是处理关键的处理程序事件。所以你必须注册它来处理类型为KeyEvent的事件。 (EventType.ROOTEventType<Event>,不是EventType<KeyEvent>

如果你看一下documentation,你会看到,可能的事件类型是

  • KeyEvent.KEY_PRESSED
  • KeyEvent.KEY_RELEASED
  • KeyEvent.KEY_TYPED
  • KeyEvent.ANY

注意,再次从documentation,那getCode()总是返回KeyCode.UNDEFINEDKEY_TYPED事件,所以你大概想无论是KeyEvent.KEY_PRESSEDKeyEvent.KEY_RELEASED,即

mainScene.addEventHandler(KeyEvent.KEY_PRESSED, handler); 

mainScene.addEventHandler(KeyEvent.KEY_RELEASED, handler); 

注意,也存在便利的方法Scene.setOnKeyPressed(...)等,尽管你只能用这些注册一个处理程序。

+0

完美的作品,谢谢! – Lithicas