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

