2015-08-15 103 views
1

我想創建一個使用JavaFX的GUI環境(仍處於非常早期階段),我已經實現了EventHandler,MouseEvent可以正常工作,但是KeyEvent似乎並沒有出於某種原因。我已經在構造函數中調用了setOnKeyPressed,setOnKeyTyped等,理論上它應該可以工作。 但我看不到實際導致問題的原因。JavaFX KeyEvent沒有觸發

GUI.java

import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import java.util.ArrayList; 

/** 
* @author JAY 
*/ 
public class GUI extends Pane implements EventHandler<Event>{ 

    private boolean up = false; 
    private boolean down = false; 
    private boolean left = false; 
    private boolean right = false; 
    private boolean spacebar = false; 
    private boolean shift = false; 
    private boolean ctrl = false; 

    private double mouseX; 
    private double mouseY; 

    public GUI(int width, int height) { 
     super(); 
     setStyle("-fx-background-color: black;"); 
     setPrefSize(width, height); 

     ArrayList<Node> things = new ArrayList<>(); 
     getChildren().addAll(things); 

     setOnKeyPressed(this); 
     setOnKeyTyped(this); 
     setOnKeyReleased(this); 

     setOnMouseMoved(this); 
     setOnMouseClicked(this); 
     setOnMouseDragged(this); 
    } 

    @Override 
    public void handle(Event event) { 
     System.out.println(event.getEventType().toString()); 

     if(event instanceof KeyEvent) { 
      if(event.getSource() == getOnKeyPressed()) { 
       keyPressed((KeyEvent) event); 
      } 
      if(event.getSource() == getOnKeyReleased()) { 
       keyReleased((KeyEvent) event); 
      } 

      System.out.println(((KeyEvent) event).getCode()); 
     } 
     if(event instanceof MouseEvent) { 
      if(event.getSource() == getOnMouseMoved()) { 
       mouseMoved((MouseEvent) event); 
      } 

      System.out.println("mouse at x: " + mouseX + " y: " + mouseY); 
     } 
    } 

    public void mouseMoved(MouseEvent e) { 
     mouseX = e.getX(); 
     mouseY = e.getY(); 
    } 

    public void keyPressed(KeyEvent e) { 
     KeyCode code = e.getCode(); 

     if (code == KeyCode.UP) 
      up = true; 
     if (code == KeyCode.DOWN) 
      down = true; 
     if (code == KeyCode.LEFT) 
      left = true; 
     if (code == KeyCode.RIGHT) 
      right = true; 
     if (code == KeyCode.SPACE) 
      spacebar = true; 
     if (code == KeyCode.SHIFT) 
      shift = true; 
     if (code == KeyCode.CONTROL) 
      ctrl = true; 
    } 

    public void keyReleased(KeyEvent e) { 
     KeyCode code = e.getCode(); 

     if (code == KeyCode.UP) 
      up = false; 
     if (code == KeyCode.DOWN) 
      down = false; 
     if (code == KeyCode.LEFT) 
      left = false; 
     if (code == KeyCode.RIGHT) 
      right = false; 
     if (code == KeyCode.SPACE) 
      spacebar = false; 
     if (code == KeyCode.SHIFT) 
      shift = false; 
     if (code == KeyCode.CONTROL) 
      ctrl = false; 
    } 

} 

Main.java

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* @author JAY 
*/ 
public class Main extends Application { 

    private GUI arena = new GUI(600, 600); 

    public void start(Stage primaryStage) { 
     primaryStage.setTitle("My GUI"); 
     primaryStage.setScene(new Scene(arena)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

回答

1

正如@Francis Fredrick Valero所說,現場是接受那些關鍵事件的場景。

在你main-> start方法,你可以這樣做:

primaryStage.setTitle("My GUI"); 
Scene scene = new Scene(arena); 
scene.setOnKeyPressed(arena); 
primaryStage.setScene(scene); 
primaryStage.show(); 
+0

謝謝你,它工作了我現在。我應該早點注意到,因爲後來我意識到在Swing中,keylistener實現了JFrame而不是JPanel。因此在JavaFX中應該是一樣的。感謝您的幫助! –

0

的場景接收到該事件。你可以試試這個嗎?

getScene().setOnKeyPressed(this); 
+0

當你創建GUI實例是行不通的原因,現場尚未創建 –