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

如何在Graphics2D中实现文本两端对齐?

实现AttributedString文本两端对齐的正确姿势

嘿,我懂你现在的困扰——TextAttribute.JUSTIFICATION看起来应该是管两端对齐的,但直接设1.0没效果确实让人摸不着头脑。其实是你没get到它的正确打开方式,我来给你拆解清楚:

核心要点:JUSTIFICATION是段落级属性,需配合正确的布局宽度

首先要明确,TextAttribute.JUSTIFICATION是控制整个段落的对齐行为,而且必须和LineBreakMeasurer的布局宽度配合才能生效。你之前设1.0(也就是TextAttribute.JUSTIFICATION_FULL)没效果,大概率是这两个原因:

  • 没有把属性应用到整个文本段落范围
  • LineBreakMeasurer.nextLayout()传入的不是「容器减去边距的可用宽度」

具体实现步骤

  1. 给整个文本设置两端对齐属性
    把TextAttribute.JUSTIFICATION属性应用到整个AttributedString的范围,而不是某一段子文本:

    AttributedString attStr = new AttributedString(yourTargetText);
    // 应用两端对齐属性到整个文本
    attStr.addAttribute(TextAttribute.JUSTIFICATION, TextAttribute.JUSTIFICATION_FULL, 0, yourTargetText.length());
    
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:37