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 cone 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 estulo dentro de un componente, usando LineBreakMeasurer, TextLayout y AttributedCharacterIterator.

Pulsa sobre la imagen para ejecutar el applet.
Esta es una imagen del GUI del applet. Para ajecutar el appler, 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();
}

Ozito