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

Java绘制同心圆问题:绘制的圆无法居中出现偏移错位

解决同心圆绘制偏移的问题

嘿,我明白你在画靶心图案时遇到的困扰——每个圆没法保持居中,总是偏移对吧?这个问题其实很典型,核心原因是没搞对drawOval()方法的坐标逻辑。

问题根源

Graphics.drawOval(x, y, width, height)里的x和y是圆的左上角顶点坐标,不是圆心坐标。如果直接用固定值或者没基于面板中心计算这些坐标,画出来的圆自然会偏移。

修正后的完整代码

我帮你补全并修正了代码,保证所有同心圆都严格居中:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

public class TargetPanel extends JPanel {
    public TargetPanel() {
        this.setPreferredSize(new Dimension(800, 800));
    }//end constructor

    public void paintComponent(Graphics g) {
        super.paintComponent(g); // 务必调用父类方法,确保面板正确刷新
        
        // 获取面板实时的中心坐标(适配面板大小变化)
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;
        
        // 定义靶心的层数:从外到内的半径和对应颜色
        int[] radii = {300, 240, 180, 120, 60};
        Color[] colors = {Color.RED, Color.WHITE, Color.RED, Color.WHITE, Color.RED};
        
        // 循环绘制每个同心圆
        for (int i = 0; i < radii.length; i++) {
            int radius = radii[i];
            g.setColor(colors[i]);
            // 关键:左上角坐标 = 中心坐标 - 半径;宽高是直径(2*半径)
            g.fillOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius);
        }
    }
}

几个关键要点

  • 必须调用super.paintComponent(g):这一步会清空面板之前的绘制内容,避免残留图形,同时确保面板背景正常渲染。
  • 基于实时宽高计算中心:用getWidth()和getHeight()代替固定的800,这样哪怕面板被拉伸,圆心依然会跟着面板中心移动。
  • 正确计算圆的位置:centerX - radius和centerY - radius让圆的左上角正好在中心的左上方,加上直径(2*radius)的宽高,圆心就完美对齐面板中心了。

如果之前你是用固定的x/y值累加来画每个圆,那肯定会出现偏移——现在改成基于中心的计算方式,所有圆就都能乖乖居中啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:03:36