gpt4 book ai didi

JavaFX - 生成形状并用箭头移动它们

转载 作者:行者123 更新时间:2023-12-04 14:03:22 25 4
gpt4 key购买 nike

我正在编写一个 JavaFX 代码,每次用户按下按钮时,它都会生成 4 种不同的形状(圆形、矩形、直线、椭圆形),到目前为止,我已经完成了圆形和矩形,正在生成形状很好,但问题是当我按下按钮时我无法移动形状,即使在我添加按钮之前它移动得很好,我也不知道代码有什么问题。

这是代码:

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.scene.control.Button;
import javafx.scene.shape.Rectangle;
import javafx.geometry.Insets;
import java.util.Random;


public class Main extends Application {
Pane pane;
Circle circle;
Rectangle rectangle;
@Override
public void start(Stage primaryStage) {
pane = new Pane();
Button button = new Button("Generate");
CreateRect c = new CreateRect();
button.setOnAction(c);
pane.setPadding(new Insets(30, 30, 30, 30));
circle = new Circle(30, 30, 30);
rectangle = new Rectangle(30,30,50,20);
pane.getChildren().add(button);
pane.setOnKeyPressed(e -> {
switch (e.getCode()) {
case UP : circle.setCenterY(circle.getCenterY() >
circle.getRadius() ? circle.getCenterY() - 15 :
circle.getCenterY()); break;
case DOWN : circle.setCenterY(circle.getCenterY() <
pane.getHeight() - circle.getRadius() ?
circle.getCenterY() + 15 : circle.getCenterY());
break;
case LEFT : circle.setCenterX(circle.getCenterX() >
circle.getRadius() ? circle.getCenterX() - 15 :
circle.getCenterX()); break;
case RIGHT : circle.setCenterX(circle.getCenterX() <
pane.getWidth() - circle.getRadius() ?
circle.getCenterX() + 15: circle.getCenterX());
}
});

Scene scene = new Scene(pane, 500, 300);
primaryStage.setTitle("SHAPES");
primaryStage.setScene(scene);
primaryStage.show();
pane.requestFocus();
}

private class CreateRect implements EventHandler<ActionEvent> {

@Override
public void handle(ActionEvent e) {
double s;
Random generator = new Random();
s = generator.nextDouble();
pane.getChildren().remove(rectangle);
pane.getChildren().remove(circle);
if (s < 0.5) {
pane.getChildren().add(rectangle);
rectangle.setX(100);
rectangle.setY(100);
rectangle.setWidth(50);
rectangle.setHeight(20);
rectangle.setFill(Color.RED);
} else {
pane.getChildren().add(circle);
circle.setCenterX(100);
circle.setCenterY(100);
circle.setRadius(80);
circle.setFill(Color.RED);
}
}
}

public static void main(String[] args) {
launch(args);
}
}

最佳答案

问题是按钮在您按下后会保留键盘焦点,并会消耗按键事件。一种解决方案是通过将焦点传递给您创建的形状来放弃焦点:

private class CreateRect implements EventHandler<ActionEvent> {

@Override
public void handle(ActionEvent e) {
double s;
Random generator = new Random();
s = generator.nextDouble();
pane.getChildren().remove(rectangle);
pane.getChildren().remove(circle);
if (s < 0.5) {
pane.getChildren().add(rectangle);
rectangle.setX(100);
rectangle.setY(100);
rectangle.setWidth(50);
rectangle.setHeight(20);
rectangle.setFill(Color.RED);
rectangle.requestFocus();
} else {
pane.getChildren().add(circle);
circle.setCenterX(100);
circle.setCenterY(100);
circle.setRadius(80);
circle.setFill(Color.RED);
circle.requestFocus();
}
}
}

如果您特别希望按钮保持焦点(以便它响应其通常的键事件,例如从 SPACE 生成一个 Action ,您可以使用不同的键事件。这似乎不太健壮解决方案(依赖于按钮的内部事件处理):

    pane.setOnKeyReleased(e -> {
// ...
});

关于JavaFX - 生成形状并用箭头移动它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69283216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com