在这里,我创建了一个简单的窗格,中间有一个圆圈。我已经创建了移动圆圈的按钮但却摆脱了它们来创建关键事件。我想知道为什么当我按下键时会触发圆圈移动没有任何反应。我试图按箭头的方向移动圆圈,但没有任何进展。解释为什么会是这样的。
package circlekeyevent;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class CircleKeyEvent extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
final Circle circle = new Circle(250, 250, 20);
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);
pane.getChildren().add(circle);
final Scene scene = new Scene(pane, 500, 500);
primaryStage.setTitle("Move the circle");
primaryStage.setScene(scene);
primaryStage.show();
//Key Events
class MoveLeft implements EventHandler <KeyEvent>{
@Override
public void handle(KeyEvent e){
if ((e.getCode() == KeyCode.LEFT && (circle.getCenterX() >= 5))) {
circle.setCenterX(circle.getCenterX()-5);
}
}
}
class MoveRight implements EventHandler <KeyEvent>{
@Override
public void handle(KeyEvent e){
if ((e.getCode() == KeyCode.RIGHT) && (circle.getCenterX() <= scene.getWidth() - 5)) {
circle.setCenterX(circle.getCenterX()+5);
}
}
}
class MoveUp implements EventHandler <KeyEvent>{
@Override
public void handle(KeyEvent e){
if ((e.getCode() == KeyCode.UP) && (circle.getCenterY() >= 5)) {
circle.setCenterY(circle.getCenterY()-5);
}
}
}
class MoveDown implements EventHandler <KeyEvent>{
@Override
public void handle(KeyEvent e){
if ((e.getCode() == KeyCode.DOWN && (circle.getCenterY() <= scene.getHeight() - 5))) {
circle.setCenterY(circle.getCenterY()+5);
}
}
}
circle.setOnKeyPressed(new MoveLeft());
circle.setOnKeyPressed(new MoveRight());
circle.setOnKeyPressed(new MoveUp());
circle.setOnKeyPressed(new MoveDown());
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:1)
我建议组合所有移动方法并使用文本字段进行键盘命令。将不透明度设置为低会使文本字段不可见并将其带回来使其不会覆盖任何内容 以下是我建议使用的代码:
package circlekeyevent;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class CircleKeyEvent extends Application {
@Override
public void start(Stage primaryStage) {
TextField textfield =new TextField();
textfield.setOpacity(0.0000001);
Pane pane = new Pane();
final Circle circle = new Circle(250, 250, 20);
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);
pane.getChildren().add(circle);
pane.getChildren().add(textfield);
textfield.toBack();
final Scene scene = new Scene(pane, 500, 500);
primaryStage.setTitle("Move the circle");
primaryStage.setScene(scene);
primaryStage.show();
//Key Events
class Move implements EventHandler <KeyEvent>{
@Override
public void handle(KeyEvent e){
if ((e.getCode() == KeyCode.RIGHT) && (circle.getCenterX() <= scene.getWidth() - 5)) {
circle.setCenterX(circle.getCenterX()+5);
} else if ((e.getCode() == KeyCode.LEFT) && (circle.getCenterX() >= 5)) {
circle.setCenterX(circle.getCenterX()-5);
} else if ((e.getCode() == KeyCode.UP) && (circle.getCenterY() >= 5)) {
circle.setCenterY(circle.getCenterY()-5);
} else if ((e.getCode() == KeyCode.DOWN && (circle.getCenterY() <= scene.getHeight() - 5))) {
circle.setCenterY(circle.getCenterY()+5);
}
}
}
textfield.setOnKeyPressed(new Move());
}
public static void main(String[] args) {
launch(args);
}
}
如果没有在文本字段顶部放置任何内容,您也可以添加设置光标
这是光标代码:
textfield.setCursor(Cursor.DEFAULT);