如何从 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();
这是我的代码。当我 运行 这个程序时,我得到一个普通场景、一个普通窗格和一个普通按钮。当我点击左上角的按钮时,一个圆出现在坐标: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();