【问题标题】:Using java2d user space measurements with TextLayout and LineBreakMeasurer使用带有 TextLayout 和 LineBreakMeasurer 的 java2d 用户空间测量
【发布时间】:2010-06-06 01:09:03
【问题描述】:

我在用户空间 (mm) 中定义了一个 java2d 图像来打印身份证。通过对所需 DPI(屏幕或打印)使用 AffineTransform 转换为像素。

我想将文本换成多行,但 TextLayout 不尊重用户空间坐标。我正在使用以下内容将包装文本写入区域:

private void drawParagraph(Graphics2D g2d, Rectangle2D area, String text) {
    LineBreakMeasurer lineMeasurer;
    AttributedString string = new AttributedString(text);
    AttributedCharacterIterator paragraph = string.getIterator();
    int paragraphStart = paragraph.getBeginIndex();
    int paragraphEnd = paragraph.getEndIndex();
    FontRenderContext frc = g2d.getFontRenderContext();
    lineMeasurer = new LineBreakMeasurer(paragraph, frc);

    float breakWidth = (float)area.getWidth();
    float drawPosY = (float)area.getY();
    float drawPosX = (float)area.getX();
    lineMeasurer.setPosition(paragraphStart);
    while (lineMeasurer.getPosition() < paragraphEnd) {
        TextLayout layout = lineMeasurer.nextLayout(breakWidth);

        drawPosY += layout.getAscent();
        layout.draw(g2d, drawPosX, drawPosY);

        drawPosY += layout.getDescent() + layout.getLeading();
    }        
}

上面的代码使用字体的用户空间大小确定字体度量,因此结果相当大。字体大小被计算为一个区域中行数的最佳垂直拟合,计算如下。例如

attr.put(TextAttribute.SIZE, (geTextArea().getHeight() / noOfLines - LINE_SPACING) );

使用 g2d.drawString("Some text to display", x, y) 时,字体大小显示正确。

有没有人有更好的方法在用户空间坐标中进行文本布局?

【问题讨论】:

  • 您在哪里设置 TextLayout 的属性?这是最重要的一步,这里没有展示。
  • 我不确定您是否可以设置任何属性,因为它是使用 LineBreakMeasurer(while 循环)创建的。 LineBreakMeasurer 的 java 文档说它不会转换到用户空间坐标。上面的代码是来自 Sun 的教程代码的教科书内容。我想知道是否有人知道这样做的另一种方式?

标签: java layout java-2d line-breaks


【解决方案1】:

一开始就应该调用g2d.scale() (当我这样做时它工作了,我的代码基于完全相同的LineBreakMeasurer 示例)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多