Gráficos con Java 2D

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.

Pulsa sobre la imagen para ejecutar  el applet.

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();
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO