【问题标题】:JavaFX KeyEvent not firingJavaFX KeyEvent 未触发
【发布时间】:2015-08-15 12:39:12
【问题描述】:

我正在尝试使用 JavaFX 创建一个 GUI 环境(仍处于早期阶段),我已经实现了 EventHandler,MouseEvent 工作正常,但 KeyEvent 似乎由于某些原因无法正常工作。我已经在构造函数中调用了 setOnKeyPressed、setOnKeyTyped 等,所以理论上它应该可以工作。 但我看不出问题的真正原因。

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);
    }

}

【问题讨论】:

    标签: java javafx keyevent eventhandler


    【解决方案1】:

    正如@Francis Fredrick Valero 所说,场景是接收这些关键事件的场景。

    在你的 main->start 方法中你可以这样做:

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

    【讨论】:

    • 谢谢,它现在对我有用。我应该早点注意到,因为我后来意识到在 Swing 中,keylistener 是在 JFrame 上实现的,而不是 JPanel。因此在 JavaFX 中应该是相同的。感谢您的帮助!
    【解决方案2】:

    场景接收事件。你可以试试这个吗?

    getScene().setOnKeyPressed(this);
    

    【讨论】:

    • 这行不通,因为在创建 GUI 实例时,尚未创建场景
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2014-01-10
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多