2015-08-15 6 views
1

Я пытаюсь создать среду GUI с использованием JavaFX (все еще на очень раннем этапе), я реализовал 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 Фредрик Валеро, это сцена, которая получает эти ключевые события.

В вашем Main-> метод запуска вы можете сделать:

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, сцена еще не создана –

Смежные вопросы