使用TextLayout和LineBreakMeasurer进行java2d用户空间测量

时间:2010-06-06 01:09:03

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

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

我想将文本换成几行,但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();
    }        
}

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

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

使用g2d.drawString(“要显示的某些文字”,x,y)时,字体大小显示正确。

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

1 个答案:

答案 0 :(得分:0)

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