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
相关产品推荐
相关产品推荐

