如何从 javafx 中的按钮内部获取关键事件

How can you get a key event for from inside a button in javafx

这是我的代码。当我 运行 这个程序时,我得到一个普通场景、一个普通窗格和一个普通按钮。当我点击左上角的按钮时,一个圆出现在坐标:450, 450,半径为90像素。但是,当我尝试使用键盘将圆圈移动 10 个像素时,我看不到任何变化。当我 运行 我的程序时,我也没有看到异常。

    Pane p = new Pane();
    Button b = new Button("Clickable");
    Circle c = new Circle(450, 450, 90, Color.RED);
    c.setVisible(false);
    EventHandler<ActionEvent> e = s -> {
        c.setOnKeyPressed(g -> {
            if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);}
            if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);}
            if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);}
            if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);}
        });
        c.setVisible(true);
    };
    b.setOnAction(e);
    p.getChildren().addAll(b, c);
    Scene s = new Scene(p, 900, 900);
    stage.setScene(s);
    stage.show();
    c.requestFocus();

我不认为不可见的节点可以获得键盘焦点;即使可以,当用户单击按钮时,也会将键盘焦点转移到按钮。按下按钮后需要将焦点放在圆圈上:

Pane p = new Pane();
Button b = new Button("Clickable");
Circle c = new Circle(450, 450, 90, Color.RED);
c.setVisible(false);
EventHandler<ActionEvent> e = evt -> {
    c.setOnKeyPressed(g -> {
        if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);}
        if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);}
        if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);}
        if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);}
    });
    c.setVisible(true);
    c.requestFocus();
};
b.setOnAction(e);
p.getChildren().addAll(b, c);
Scene s = new Scene(p, 900, 900);
stage.setScene(s);
stage.show();

根据您的具体要求,在场景中注册事件处理程序总体上可能更好:

Pane p = new Pane();
Scene s = new Scene(p, 900, 900);
Button b = new Button("Clickable");
Circle c = new Circle(450, 450, 90, Color.RED);
c.setVisible(false);
EventHandler<ActionEvent> e = evt -> {
    s.setOnKeyPressed(g -> {
        if(g.getCode() == UP) {c.setCenterY(c.getCenterY() + 10);}
        if(g.getCode() == DOWN) {c.setCenterY(c.getCenterY() - 10);}
        if(g.getCode() == RIGHT) {c.setCenterX(c.getCenterX() + 10);}
        if(g.getCode() == LEFT) {c.setCenterX(c.getCenterX() - 10);}
    });
    c.setVisible(true);
};
b.setOnAction(e);
p.getChildren().addAll(b, c);
stage.setScene(s);
stage.show();