Использование измерений пространства пользователя java2d с TextLayout и LineBreakMeasurer - PullRequest
2 голосов
/ 06 июня 2010

У меня есть изображение 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();
    }        
}

Приведенный выше код определяет метрики шрифта, используя размеры шрифта в пользовательском пространстве и, таким образом, получается довольно большим. Размер шрифта рассчитывается как наилучшее соответствие по вертикали для количества линий в области с вычислением, как показано ниже. Э.Г.

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

При использовании g2d.drawString («Некоторый текст для отображения», x, y) размер шрифта отображается правильно.

Кто-нибудь есть лучший способ сделать макет текста в co-ords пространства пользователя?

1 Ответ

0 голосов
/ 09 ноября 2011

Вначале должен сделать вызов g2d.scale() (это сработало, когда я это сделал, и мой код основан на точно таком же примере LineBreakMeasurer).

...