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

Java Swing绘制随机大小随机颜色圆形的混乱代码修复求助

Java Swing 随机圆形绘图程序修正

原代码存在的明确问题

  • 无自定义Circle类实现,直接调用不存在的Circle构造方法,属于未定义引用
  • 乱码引用未声明的pane、panel变量,add(circle)语句写在循环作用域外部,逻辑完全错位
  • 没有重写Swing绘图核心的paintComponent方法,完全缺失实际像素绘制的流程
  • 保留了大量和当前需求无关的高频定时器、键盘监听冗余逻辑,属于之前调试其他功能残留的代码,严重干扰主流程
  • 随机值生成逻辑写在不存在的run()方法里,没有任何有效触发入口
  • 生成的随机颜色没有和对应的圆形对象绑定,两者完全割裂

修正后可直接运行的完整代码

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Random;

// 自定义圆形实体类,存储单个圆形的所有属性
class MyCircle {
    double x;
    double y;
    double diameter;
    Color fillColor;

    public MyCircle(double x, double y, double diameter, Color fillColor) {
        this.x = x;
        this.y = y;
        this.diameter = diameter;
        this.fillColor = fillColor;
    }
}

public class RandomCircleDrawer extends JPanel {
    // 需求固定参数:生成圆形总数、半径取值范围
    private static final int N_CIRCLES = 10;
    private static final double MIN_RADIUS = 5;
    private static final double MAX_RADIUS = 50;
    // 集合存储所有已生成的圆形对象
    private final ArrayList<MyCircle> circleList = new ArrayList<>();

    public RandomCircleDrawer() {
        setBackground(Color.WHITE);
        // 等组件完成布局、获取实际尺寸后再生成圆形,避免位置计算偏差
        SwingUtilities.invokeLater(this::generateRandomCircles);
    }

    // 随机圆形生成核心逻辑
    private void generateRandomCircles() {
        Random gen = new Random();
        int panelWidth = getWidth();
        int panelHeight = getHeight();

        for (int i = 0; i < N_CIRCLES; i++) {
            // 随机生成半径,换算为绘制用的直径值
            double radius = gen.nextDouble(MIN_RADIUS, MAX_RADIUS);
            double diameter = 2 * radius;
            // 计算圆形左上角坐标,保证圆形完全在面板显示范围内
            double x = gen.nextDouble(0, Math.max(1, panelWidth - diameter));
            double y = gen.nextDouble(0, Math.max(1, panelHeight - diameter));
            // 生成完全随机的RGB填充色
            int red = gen.nextInt(256);
            int green = gen.nextInt(256);
            int blue = gen.nextInt(256);
            Color randomColor = new Color(red, green, blue);
            // 组装圆形对象存入集合
            circleList.add(new MyCircle(x, y, diameter, randomColor));
        }
        // 触发面板重绘
        repaint();
    }

    // 重写Swing核心绘图方法
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // 遍历所有存储的圆形,按属性完成绘制
        for (MyCircle circle : circleList) {
            g2d.setColor(circle.fillColor);
            g2d.fillOval((int) circle.x, (int) circle.y, (int) circle.diameter, (int) circle.diameter);
        }
    }

    // 程序运行入口
    public static void main(String[] args) {
        JFrame frame = new JFrame("随机圆形绘图程序");
        RandomCircleDrawer panel = new RandomCircleDrawer();
        frame.add(panel);
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

实现效果

  • 启动后自动在800*600尺寸的窗口内生成10个圆形
  • 每个圆形的半径在5px到50px区间随机取值
  • 每个圆形的填充色为无规律的RGB随机值
  • 所有圆形完全显示在面板范围内,不会被窗口边缘裁切

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 15:54:04