## Trabajar con Texto

El soporte para trabajar con texto primitivo está compartido entre estas tres clases del AWT: Graphics, Font,, y FontMetrics.

#### Dibujar Texto

> Cuando escribimos código para dibujar texto, lo primero que debemos considerar es si podemos utilizar componentes orientados a texto, como las clases Label, TextField, o TextArea. Si no existe ningún componente apropiado, podemos usar los métodos drawBytes(), drawChars(), o drawString() de Graphics.

> Aquí tenemos un ejemplo de código que dibuja una cadena en la pantalla:

>     g.drawString("Hello World!", x, y);

Para los métodos de dibujo de texto, x e y son enteros que especifican las posición de la esquina inferior izquierda deltexto. Para ser precisos, la coordenada y especifica la línea base del texto -- la línea en la que empiezan la mayoría de las letras -- que no incluyen los rabos (descendentes) como el de la letra "y". Debemos asegurarnos de que y sea lo suficientemente grande para permitir espacio vertical para todas las letras.

Aquí hay una imagen que muestra la línea base, así como las líneas de los ascendentes y de los descententes. Aprenderemos algo más sobre los ascendentes y los descendentes un poco más adelante.

Aquí hay un applet que ilustra lo que puede suceder cuando no se tiene cuidado con el posicionamiento del texto:

> Nota: Como algunos viejos navegadores no soportan 1,1, el applet anterior es una versión 1.0, (aquí está código 1.0; y aquí está el codigo 1.1). Para ejecutar la versión 1.1 del applet, puedes ir a example-1dot1/TextXYDemo.html. Para más información sobre la ejecución de applets puedes ver Sobre Nuestros Ejemplos.

La cadena superior probablemente estará cortada, ya que su argumento y es 5, lo que deja sólo 5 pixels sobre la líne base para la cadena -- lo que no es suficiente para la mayoría de las fuentes. La cadena central probablemente se verá perfecta, a menos que tengas una fuente enorme por defecto. La mayoría de las letras de la cadena inferior se mostrarán bien, excepto la letras con descendentes. Todos los descendentes de la cadena inferior estarán cortados ya que el código que muestra esta cadena no deja espacio para ellos.

Nota: la interpretación que los métodos de dibujo de texto hacen de x e y es diferente de la que hacen los métodos de dibujo de formas. Cuando se dibuja una forma (un rectángulo, por ejemplo) x e y especifican la esquina superior izquierda del rectángulo, en lugar de la esquina inferior izquierda.

#### Obtener Información sobre una Fuente: FontMetrics

> El ejemplo de dibujo de formas de la página anterior podría mejorarse eligiendo una fuente más pequeña que la fuente por defecto normal. El siguiente ejemplo hace esto y también agranda las formas para ocupar el espacio liberado por la fuente más pequeña. Abajo tienes el applet mejorado:

> > Nota: Como algunos viejos navegadores no soportan 1,1, el applet anterior es una versión 1.0, (aquí está código 1.0; y aquí está el codigo 1.1). Para ejecutar la versión 1.1 del applet, puedes ir a example-1dot1/FontDemo.html. Para más información sobre la ejecución de applets puedes ver Sobre Nuestros Ejemplos.

> El ejemplo elige la fuente apropiada utilizando un objeto FontMetrics para obtener detalles del tamaño de la fuente. Por ejemplo, el siguiente bucle (en el método paint()) se asegura que la cadena más larga mostrada por el applet ("drawRoundRect()") entra dentro del espacio asignado a cada forma.

>     boolean fontFits = false;
>     Font font = g.getFont();
>     FontMetrics fontMetrics = g.getFontMetrics();
>     int size = font.getSize();
>     String name = font.getName();
>     int style = font.getStyle();

>     while (!fontFits) {
>         if ( (fontMetrics.getHeight() <= maxCharHeight)
>           && (fontMetrics.stringWidth(longString)
>     	  <= xSpace)) {
>             fontFits = true;
>         } else {
>             if (size <= minFontSize) {
>                 fontFits = true;
>             } else {
>                 g.setFont(font = new Font(name,
>                                           style,
>                                           --size));
>                 fontMetrics = g.getFontMetrics();
>             }
>         }
>     }

> El ejemplo de código anterior utiliza los métodos getFont(), setFont(), y getFontMetrics() de la clase Graphics para obtener y seleccionar la fuente actual y para obtener el objeto FontMetrics que corresponde con el font. Desde los métodosgetHeight() y getStringWidth() de FontMetrics, el código obtiene la información sobre el tamaño vertical y horizontal de la fuente.

> La siguiente figura muestra parte de la información que un objeto FontMetrics puede proporcionar sobre el tamaño de una fuente.

> Aquí tienes un sumario de los métodos de FontMetrics que devuelven información sobre el tamaño vertical de la fuente:

> getAscent(), getMaxAscent()
>   El método getAscent() devuelve el número de pixels entre la línea de ascendetes y la línea base. Generalmente, la línea de ascendentes representa la altura típica de una letra mayúscula. Especificamente, los valores ascendente y descendente los elige el diseñador de la fuente para representar el "color" correcto del texto, o la densidad de la tinta, para que el texto aparezca como lo planeó el diseñador. El ascendente típico porporciona suficiente espacio para casi todos los caracteres de la fuente, excepto quizás para los acentos de las letras mayúsculas. El método getMaxAscent() tiene en cuenta estos caracteres excepcionalmente altos.

> getDescent(), getMaxDescent()
>   El método getDescent() devuelve el número de pixels entre la línea base y la línea de descendentes. En la mayoría de las fuentes, todos los caracteres caen en la línea descendente en su punto más bajo. Sólo en algunos caso, podrá utilizar el método getMaxDescent() para obtener una distancia garantizada para todos los caracteres.

> getHeight()
>   Obtiene el número de pixels que se encuentran normalmente entre la línea base de una línea de texto y la línea base de la siguiente línea de texto. Observa que esto incluye el espacio para los ascendentes y descendentes.

> getLeading()
>   Devuelve la distancia sugerida (en pixels) entre una línea de texto y la siguiente. Especificamente, esta es la distancia entre la línea descendente de una línea de texto y la línea ascendente de la siguiente.

> Observa que el tamaño de la fuente (devuelto por el método getSize() de la clase Font) es una media abstracta. Teoricamente, corresponde al ascendente más el descendente. Sin embargo, en la práctica, el diseñador decide la altura que debe tener una fuente de "12 puntos". Por ejemplo, Times de 12-puntos es ligeramente más baja que Helvetica de 12-puntos. Típicamente, las fuentes se miden en puntos, que es aproximadamente 1/72 de pulgada.

> La siguiente lista muestra los métodos que proporciona FontMetrics para devolver información sobre el tamaño horizontal de una fuente. Estos métodos tienen en cuenta el espacio entre los caracteres. Más precisamente, cada método no devuelve el número de pixels de un carácter particular (o caracteres), sino el número de pixels que avanzará la posición actual cuando se muestre el carácter (o caracteres). Llamamos a esto anchura de avance para distinguirla de la anchura del texto.

> getMaxAdvance()
>   La anchura de avance (en pixels) del carácter más ancho de la fuente.

> bytesWidth(byte[], int, int)
>   La anchura de avance del texto representado por el array de bytes especificado. El primer argumento entero especifica el origen de los datos dentro del array. El segundo argumento entero especifica el número máximo de bytes a chequear.

> charWidth(int),charWidth(char)
>   La anchura de avance del carácter especificado.

> charsWidth(char[], int, int)
>   La anchura de avance de la cadena representada por el array de caracteres especificado.

> stringWidth(String)
>   La anchura de avance de la cadena especificada.

> getWidths()
>   La anchura de avance de cada uno de los primeros 256 caracteres de la fuente.

Ozito