如何使用循环在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
相关产品推荐
相关产品推荐

