Java Swing绘图异常:为何程序绘制出两个圆形?
为什么我的Java Swing程序会绘制两个圆形?
问题根源
你看到两个圆形的直接原因有两个:
- 重复触发绘制逻辑:当你创建
Rita实例并调用setVisible(true)后,Swing的事件调度线程会自动触发一次paint方法绘制窗口;而你又在main方法里手动调用了rita.paint(null),相当于执行了两次绘制代码,所以出现两个圆。 - 未执行父类绘制逻辑:重写
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
相关产品推荐
相关产品推荐

