2017-03-02 97 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