如何在Graphics2D中实现文本两端对齐?
实现AttributedString文本两端对齐的正确姿势
嘿,我懂你现在的困扰——TextAttribute.JUSTIFICATION看起来应该是管两端对齐的,但直接设1.0没效果确实让人摸不着头脑。其实是你没get到它的正确打开方式,我来给你拆解清楚:
核心要点:JUSTIFICATION是段落级属性,需配合正确的布局宽度
首先要明确,TextAttribute.JUSTIFICATION是控制整个段落的对齐行为,而且必须和LineBreakMeasurer的布局宽度配合才能生效。你之前设1.0(也就是TextAttribute.JUSTIFICATION_FULL)没效果,大概率是这两个原因:
- 没有把属性应用到整个文本段落范围
LineBreakMeasurer.nextLayout()传入的不是「容器减去边距的可用宽度」
具体实现步骤
给整个文本设置两端对齐属性
把TextAttribute.JUSTIFICATION属性应用到整个AttributedString的范围,而不是某一段子文本:AttributedString attStr = new AttributedString(yourTargetText); // 应用两端对齐属性到整个文本 attStr.addAttribute(TextAttribute.JUSTIFICATION, TextAttribute.JUSTIFICATION_FULL, 0, yourTargetText.length());用LineBreakMeasurer按可用宽度逐行布局
关键是nextLayout()要传入「容器宽度 - 左右边距」的数值,这样布局才有空间来拉伸文本实现两端对齐:// 假设你的容器宽度是containerWidth,左右边距分别是leftMargin、rightMargin float availableWidth = containerWidth - leftMargin - rightMargin; FontRenderContext frc = new FontRenderContext(null, false, false); LineBreakMeasurer measurer = new LineBreakMeasurer(attStr.getIterator(), frc); float drawX = leftMargin; float drawY = topMargin; // 顶部边距 while (measurer.getPosition() < yourTargetText.length()) { // 获取当前行的TextLayout,宽度限制为可用宽度 TextLayout layout = measurer.nextLayout(availableWidth); // 绘制该行,x从leftMargin开始,两端对齐会自动填充到rightMargin layout.draw(graphics2D, drawX, drawY + layout.getAscent()); // 下移y坐标,准备下一行 drawY += layout.getDescent() + layout.getLeading(); }
为什么之前没效果?
- 如果只给部分文本设置
JUSTIFICATION,它不会生效——这是段落属性,必须覆盖整个文本块。 - 如果
nextLayout()传入的宽度等于文本本身的宽度,那没有多余空间可以拉伸,自然看不到两端对齐的效果。 - 另外,排版逻辑上最后一行默认不会两端对齐(避免单词间距过大),如果要强制最后一行也对齐,需要手动调整(比如计算剩余空间,手动添加字符间距,但一般不推荐这么做)。
额外提示
TextAttribute.JUSTIFICATION的取值范围0~1:0是左对齐(默认),1是完全两端对齐,中间值是部分对齐(比如0.5就是半对齐,很少用到)。- 确保你的
Graphics2D上下文没有额外的裁剪或偏移设置,否则可能影响最终的绘制效果。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

