Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFXKeyEvent未触发_Java_Javafx_Keyevent_Eventhandler - Fatal编程技术网

JavaFXKeyEvent未触发

JavaFXKeyEvent未触发,java,javafx,keyevent,eventhandler,Java,Javafx,Keyevent,Eventhandler,我正在尝试使用JavaFX创建一个GUI环境(仍处于非常早期的阶段),我已经实现了EventHandler,MouseEvent工作正常,但是KeyEvent似乎由于某些原因无法工作。我已经在构造函数中调用了setOnKeyPressed、setOnKeyTyped等,所以理论上它应该可以工作。 但我看不出到底是什么导致了这个问题 GUI.java import javafx.event.Event; import javafx.event.EventHandler; import javafx

我正在尝试使用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;
    }

}

场景接收事件。你能试试这个吗

getScene().setOnKeyPressed(this);

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

在main->start方法中,您可以执行以下操作:

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

这是行不通的,因为当你创建GUI实例时,场景还没有被创建谢谢,它现在对我起作用了。我应该早点注意到,因为我后来意识到,在Swing中,keylistener是在JFrame上实现的,而不是在JPanel上实现的。因此在JavaFX中应该是相同的。谢谢你的帮助!
primaryStage.setTitle("My GUI");
Scene scene = new Scene(arena);
scene.setOnKeyPressed(arena);
primaryStage.setScene(scene);
primaryStage.show();