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

Java图形绘制:如何让文字随椭圆居中移动及repaint清除旧内容

解决椭圆文本居中与重绘清除问题

我来帮你搞定这两个问题,分两步拆解解决:

一、让姓名始终保持椭圆中心

要实现文本随椭圆移动且始终居中,核心是基于椭圆的中心坐标计算文本绘制位置,而不是用固定偏移。因为drawString的坐标是文本左下角位置,所以需要借助FontMetrics获取文本宽高,才能精准对齐中心:

  • 先算椭圆中心:椭圆左上角是(spot, spot),宽高都是200,所以中心x = spot + 200/2,中心y = spot + 200/2;
  • 通过g.getFontMetrics()拿到当前字体的度量信息,获取文本的宽度和高度;
  • 文本绘制x坐标 = 椭圆中心x - 文本宽度/2,绘制y坐标 = 椭圆中心y + 文本高度/2(因为drawString的y是文本基线,加上高度一半才能垂直居中)。

二、重绘时清除原有内容

在paint方法最开头调用super.paint(g)就能解决重复绘制问题。AWT的paint方法默认会先清除组件背景区域,调用父类的paint方法能确保旧绘制内容被清除,再绘制新图形。

修改后的完整代码

public void paint(Graphics g) { 
    // 第一步:调用父类paint方法,清除原有绘制内容
    super.paint(g);

    g.setColor(Color.GREEN); 
    int ovalX = spot;
    int ovalY = spot;
    int ovalWidth = 200;
    int ovalHeight = 200;
    g.drawOval(ovalX, ovalY, ovalWidth, ovalHeight); 

    // 计算椭圆中心坐标
    int centerX = ovalX + ovalWidth / 2;
    int centerY = ovalY + ovalHeight / 2;

    String text = "Name"; 
    // 获取字体度量信息,计算文本宽高
    FontMetrics metrics = g.getFontMetrics();
    int textWidth = metrics.stringWidth(text);
    int textHeight = metrics.getAscent();

    // 计算文本绘制的起始坐标,确保中心对齐
    int textX = centerX - textWidth / 2;
    int textY = centerY + textHeight / 2;

    g.drawString(text, textX, textY); 

    // 添加图片(加非空判断避免空指针异常)
    if (image != null) {
        g.drawImage(image, 0, 0, this); 
    }
}

额外小建议:如果你的组件是Swing的JComponent子类,推荐使用paintComponent方法而非paint,并在开头调用super.paintComponent(g),这是Swing组件绘制的标准做法,能更稳妥地处理UI渲染逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:28