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

如何使用循环在Java Swing中绘制居中的靶心图形

用Java Swing循环绘制居中的靶心图形

嘿,我完全懂你硬编码画圆时遇到的居中痛点——手动算每个圆的位置不仅麻烦,还很容易出错,代码也冗余得不行。用循环来绘制同心圆不仅能完美解决居中问题,还能让代码更灵活、好维护。

问题分析

硬编码逐个画圆时,你大概率是手动指定了每个圆的左上角坐标,没有基于面板的中心来计算,导致圆没法对齐到中心。而循环方案的核心就是始终以面板的中心作为所有同心圆的圆心,通过递减半径来实现靶心的层次感。

改进后的完整代码

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

public class TargetPanel extends JPanel {
    // 定义靶心的颜色交替序列,可按需修改
    private static final Color[] COLORS = {Color.RED, Color.WHITE};
    // 最外层圆的初始半径
    private static final int START_RADIUS = 100;
    // 每层圆的半径递减步长
    private static final int RADIUS_STEP = 20;
    // 靶心的总层数
    private static final int LAYERS = 5;

    public TargetPanel() {
        // 设置面板首选大小
        this.setPreferredSize(new Dimension(250, 250));
        // 面板背景设为白色,让靶心更清晰
        this.setBackground(Color.WHITE);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        // 获取面板的中心坐标,这是所有圆的共同圆心
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;

        // 循环绘制每层同心圆
        for (int i = 0; i < LAYERS; i++) {
            // 计算当前层的半径:初始半径减去步长乘层数
            int radius = START_RADIUS - (RADIUS_STEP * i);
            // 交替切换颜色,实现红白相间的靶心效果
            g.setColor(COLORS[i % COLORS.length]);
            // 绘制填充圆:左上角坐标=中心-半径,宽高=半径*2(保证是正圆)
            g.fillOval(centerX - radius, centerY - radius, radius * 2, radius * 2);
        }
    }

    // 测试用主方法,快速运行看效果
    public static void main(String[] args) {
        JFrame frame = new JFrame("靶心图形");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TargetPanel());
        frame.pack();
        frame.setLocationRelativeTo(null); // 让窗口居中显示
        frame.setVisible(true);
    }
}

关键细节说明

  • 居中核心:通过centerX = getWidth() / 2和centerY = getHeight() / 2获取面板中心,所有圆都围绕这个点绘制,不管面板大小怎么变,靶心始终居中。
  • 正圆绘制逻辑:fillOval的参数是x, y, width, height,其中x和y是圆的左上角坐标,所以用centerX - radius和centerY - radius来确保圆心在面板中心;宽高设为radius*2是为了保证绘制的是正圆,不会变成椭圆。
  • 灵活配置:你可以随时修改START_RADIUS(初始半径)、RADIUS_STEP(每层递减步长)、LAYERS(层数)和COLORS数组,轻松调整靶心的大小、层数和颜色搭配,完全不用改循环逻辑。

这样修改后,不仅解决了居中问题,代码也简洁易扩展多啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:30:24