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

