JavaFX实现鼠标点击场景时圆形随机变换位置
解决JavaFX点击场景随机移动圆形的问题
核心修改要点
- 保存所有创建的圆形到列表,方便后续批量修改位置
- 修复初始化时第一个圆形参数错误的问题
- 给场景添加鼠标点击事件,触发圆形位置重计算
修改后的完整代码
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; import java.util.ArrayList; import java.util.List; import java.util.Random; public class RandomCircles extends Application { Random random = new Random(); @Override public void start(Stage primaryStage) { Group root = new Group(); List<Circle> circles = new ArrayList<>(); int sceneWidth = 800; int sceneHeight = 500; // 创建10个圆形并保存到列表 for (int i = 0; i < 10; i++) { // 先计算参数再创建圆形,避免第一个圆参数为0 int radius = random.nextInt(66) + 10; int x = random.nextInt(sceneWidth - 2 * radius) + radius; int y = random.nextInt(sceneHeight - 2 * radius) + radius; Circle circle = new Circle(x, y, radius); circle.setFill(Color.BLACK); circle.setStroke(Color.BLUE); root.getChildren().add(circle); circles.add(circle); } Scene scene = new Scene(root, sceneWidth, sceneHeight, Color.BEIGE); // 添加鼠标点击事件,重新设置每个圆形的位置 scene.setOnMouseClicked(event -> { for (Circle circle : circles) { int radius = (int) circle.getRadius(); int newX = random.nextInt(sceneWidth - 2 * radius) + radius; int newY = random.nextInt(sceneHeight - 2 * radius) + radius; circle.setCenterX(newX); circle.setCenterY(newY); } }); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
代码说明
- 保存圆形列表:用
List<Circle>存储所有创建的圆形,这样在点击事件中可以遍历修改每个圆的位置。 - 修复初始化逻辑:把半径、坐标的计算移到创建
Circle对象之前,避免第一个圆使用初始的0值。 - 鼠标点击事件处理:在
setOnMouseClicked中,遍历每个圆形,根据其固定的半径重新计算不超出场景范围的随机坐标,通过setCenterX和setCenterY更新位置。 - 场景边界适配:使用场景的实际宽高计算坐标,确保圆形始终完全显示在场景内,不会出现部分超出的情况。
内容的提问来源于stack exchange,提问作者megami
相关产品推荐
相关产品推荐

