Dibujar Múltiples Líneas de Texto
Si tenemos un párrafo de texto con estilo que queremos que quepa dentro de una anchura
especifica, podemos usar LineBreakMeasurer, que permite que el texto
con estilo se rompa en líneas que caben dentro de un espacio visual. Como hemos aprendido
en Mostrar Gráficos con Graphics2D,
un objeto TextLayout representa datos de caracteres con estilo, que
no se pueden cambiar, pero también permite acceder a la información de distribución. Los
métodos getAscent y getDescent de
TextLayout devuelven información sobre la fuente usada para posicionar las
líneas en el componente. El texto se almacena como un
AttributedCharacterIterator para que los atributos de fuente y tamaño de punto
puedan ser almacenados con el texto.
Ejemplo: LineBreakSample
El siguiente applet posiciona un párrafo de texto con estilo dentro de un componente,
usando LineBreakMeasurer, TextLayout y
AttributedCharacterIterator.
Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa
sobre ella. El applet aparecerá en una nueva ventana del navegador.
El código completo del applet está en LineBreakSample.java
.
El siguiente código crea un bucle con la cadena vanGogh. El inicio y
final del bucle se recupera y se crea una nueva línea.
AttributedCharacterIterator paragraph = vanGogh.getIterator();
paragraphStart = paragraph.getBeginIndex();
paragraphEnd = paragraph.getEndIndex();
lineMeasurer = new LineBreakMeasurer(paragraph,
new FontRenderContext(null, false, false));
El tamaño de la ventana se utiliza para determinar dónde se debería romper la línea y se
crea un objeto TextLayout por cada línea del párrafo.
Dimension size = getSize();
float formatWidth = (float) size.width;
float drawPosY = 0;
lineMeasurer.setPosition(paragraphStart);
while (lineMeasurer.getPosition() < paragraphEnd) {
TextLayout layout = lineMeasurer.nextLayout(formatWidth);
// Move y-coordinate by the ascent of the layout.
drawPosY += layout.getAscent();
/* Compute pen x position. If the paragraph is
rogth-to-left, we want to align the TextLayouts
to the right edge of the panel.
*/
float drawPosX;
if (layout.isRIGHTToLEFT()) {
drawPosX = 0;
}
else {
drawPosX = formatWidth - layout.getAdvance();
}
// Draw the TextLayout at (drawPosX, drawPosY).
layout.draw(graphics2D, drawPosX, drawPosY);
// Move y-coordinate in preparation for next layout.
drawPosY += layout.getDescent() + layout.getLeading();
}