Cuando escribas código para dibujar texto, lo primero que deberías considerar es si puede utilizar un Componente orientado a texto como una clase Label, TextField o TextArea. Si no hay ningún componente apropiado puedes utilizar los métodos drawBytes(), drawChars(), o drawString() de la clase Graphics.Aquí tienes un ejemplo de código que dibuja una cadena en la pantalla:
g.drawString("Hello World!", x, y);Para los métodos de dibujo, x e y son enteros que especifican la posición de esquina inferior izquierda del texto. Para ser más precisos, la coordenada y especifica la línea base del texto -- la línea en la que descansan la mayoría de las letras -- lo que no incluye espacio para los tallos (descendentes) de letras como la "y". Aségurate de hacer y lo suficientemente grande para permitir el espacio vertical para el texto, pero lo suficientemente pequeño para asignar espacio para los descendentes.Aquí tienes una figura que muestra la línea base, así como las líneas ascendente y descendente. Aprenderás más sobre los ascendentes y los descendentes un poco más adelante.
![]()
Aquí tienes un applet sencillo que ilustra lo que sucede cuento usted no tiene cuidado con la posición del texto:
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. (Aquí tienes el código fuente del applet.)
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.
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 (aquí tienes el código fuente):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 textFits = false; Font font = g.getFont(); FontMetrics fontMetrics = g.getFontMetrics(); while (!textFits) { if ((fontMetrics.getHeight() <= maxCharHeight) && (fontMetrics.stringWidth("drawRoundRect()") <= gridWidth)) { textFits = true; } else { g.setFont(font = new Font(font.getName(), font.getStyle(), font.getSize() - 1)); 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.