You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

代码说明

  1. 保存圆形列表:用List<Circle>存储所有创建的圆形,这样在点击事件中可以遍历修改每个圆的位置。
  2. 修复初始化逻辑:把半径、坐标的计算移到创建Circle对象之前,避免第一个圆使用初始的0值。
  3. 鼠标点击事件处理:在setOnMouseClicked中,遍历每个圆形,根据其固定的半径重新计算不超出场景范围的随机坐标,通过setCenterX和setCenterY更新位置。
  4. 场景边界适配:使用场景的实际宽高计算坐标,确保圆形始终完全显示在场景内,不会出现部分超出的情况。

内容的提问来源于stack exchange,提问作者megami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:27:18