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

Java Swing绘图异常:为何程序绘制出两个圆形?

为什么我的Java Swing程序会绘制两个圆形?

问题根源

你看到两个圆形的直接原因有两个:

  1. 重复触发绘制逻辑:当你创建Rita实例并调用setVisible(true)后,Swing的事件调度线程会自动触发一次paint方法绘制窗口;而你又在main方法里手动调用了rita.paint(null),相当于执行了两次绘制代码,所以出现两个圆。
  2. 未执行父类绘制逻辑:重写paint方法时没有调用super.paint(g),导致窗口背景没有被正确清空,之前绘制的内容可能残留,进一步加重了重复绘制的问题。

另外你注释的循环代码还有个小bug:for (int i = 0; i<5; i++);后面多了个分号,这会让循环体变成空语句,就算取消注释也只会画一个圆。

修复后的完整代码

下面是修正后的代码,同时遵循了Swing的标准绘制规范:

import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.Random;

public class Rita extends JFrame {
    public Rita() {
        setTitle("Rita");
        setSize(960, 960);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // 添加自定义绘制面板
        add(new CirclePanel());
        setVisible(true);
    }

    // 用JPanel处理绘制是Swing的标准做法,避免和窗口边框、标题栏冲突
    class CirclePanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            // 必须调用父方法,清空背景并完成基础绘制
            super.paintComponent(g);
            Random rand = new Random();
            
            // 循环绘制5个圆,注意去掉原来的多余分号
            for (int i = 0; i < 5; i++) {
                // 生成随机RGB颜色
                int red = rand.nextInt(256);
                int green = rand.nextInt(256);
                int blue = rand.nextInt(256);
                Color randomColor = new Color(red, green, blue);
                
                // 生成随机直径(20~220)
                int diameter = rand.nextInt(201) + 20;
                
                // 计算随机位置,确保圆不会超出面板范围
                int x = rand.nextInt(getWidth() - diameter);
                int y = rand.nextInt(getHeight() - diameter);
                
                g.setColor(randomColor);
                g.fillOval(x, y, diameter, diameter);
            }
        }
    }

    public static void main(String[] args) {
        // Swing组件需在事件调度线程中创建,符合线程安全规范
        javax.swing.SwingUtilities.invokeLater(() -> {
            new Rita();
        });
    }
}

关键修复点说明

  • 移除了手动调用paint(null)的代码,让Swing自动管理绘制流程。
  • 改用JPanel的paintComponent方法做绘制,避免和窗口的非绘制区域冲突。
  • 每次绘制前调用super.paintComponent(g),确保面板被清空,不会残留旧绘制内容。
  • 修复了循环的分号问题,现在能正确绘制5个随机圆。
  • 用getWidth()和getHeight()替代硬编码的960,窗口大小改变时也能正确计算圆的位置。
  • 将窗口创建放到SwingUtilities.invokeLater中,遵循Swing的线程安全要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:10:55