У меня есть изображение 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 пространства пользователя?