sábado, 30 de junio de 2012

Gráficos, Texto e Imágenes en Java


En esta parte final del AWT se van a describir, también muy sucintamente, algunas clases y métodos para realizar dibujos y añadir texto e imágenes a la interface gráfica de usuario.

Capacidades gráficas del AWT: Métodos paint(), repaint() y update()

La clase Component tiene tres métodos muy importantes relacionados con gráficos: paint(), repaint() y update(). Cuando el usuario llama al método repaint() de un componente, el AWT llama al método update() de ese componente, que por defecto llama al método paint().

Método paint(Graphics g)

El método paint() está definido en la clase Component, pero ese método no hace nada y hay que redefinirlo en una de sus clases derivadas. El programador no tiene que preocuparse de llamar a este método: el sistema operativo lo llama al dibujar por primera vez una ventana, y luego lo vuelve a llamar cada vez que entiende que la ventana o una parte de la ventana debe ser re-dibujada (por ejemplo, por haber estado tapada por otra ventana y quedar de nuevo a la vista).

Método update(Graphics g)

El método update() hace dos cosas: primero re-dibuja la ventana con el color de fondo y luego llama al método paint(). Este método también es llamado por el AWT, y también puede ser llamado por el programador, quizás porque ha realizado algún cambio en la ventana y necesita que se dibuje de nuevo.
La propia estructura de este método -el comenzar pintando de nuevo con el color de fondo hace que se produzca parpadeo (flicker) en las animaciones. Una de las formas de evitar este efecto es redefinir este método de una forma diferente, cambiando de una imagen a otra sólo lo que haya que cambiar, en vez de re-dibujar todo otra vez desde el principio. Este método no siempre proporciona los resultados buscados y hay que recurrrir al método del doble buffer.

Método repaint()

Este es el método que con más frecuencia es llamado por el programador. El método repaint() llama “lo antes posible” al método update() del componente. Se puede también especificar un número de milisegundos para que el método update() se llame transcurrido ese tiempo. El método repaint() tiene las cuatro formas siguientes:
repaint( )
repaint(long time)
repaint(int x, int y, int w, int h)
repaint(long time, int x, int y, int w, int h)
Las formas tercera y cuarta permiten definir una zona rectangular de la ventana a la que aplicar el método.

Clase Graphics

El único argumento de los métodos update() y paint() es un objeto de esta clase. La clase Graphics dispone de métodos para soportar dos tipos de gráficos:
  1. Dibujo de primitivas gráficas (texto, líneas, círculos, rectángulos, polígonos, …).
  2.  Presentación de imágenes en formatos *.gif y *.jpeg.
Además, la clase Graphics mantiene un contexto gráfico: un área de dibujo actual, un color de dibujo del background y otro del foreground, un font con todas sus propiedades, etc. La Figura muestra el sistema de coordenadas utilizado en Java. Como es habitual en Informática, los ejes están situados en la esquina superior izquierda, con la orientación indicada en la Figura (eje de ordenadas descendente). Las coordenadas se miden siempre en pixels.
Coordenadas de los gráficos de Java.

Primitivas gráficas

Java dispone de métodos para realizar dibujos sencillos, llamados a veces “primitivas” gráficas. Como se ha dicho, las coordenadas se miden en pixels, empezando a contar desde cero. La clase Graphics dispone de los métodos para primitivas gráficas reseñados en la Tabla. Excepto los polígonos y las líneas, todas las formas geométricas se determinan por el rectángulo que las comprende, cuyas dimensiones son w y h. Los polígonos admiten un argumento de la clase java.awt.Polygon.
Métodos de la clase Graphics para dibujo de primitivas gráficas.
Los métodos draw3DRect()fill3DRect()drawOval()fillOval()drawArc() y fillArc() dibujan objetos cuyo tamaño total es (w+1, h+1) pixels.

Clases Graphics y Font

La clase Graphics permite “dibujar” texto, como alternativa al texto mostrado en los componentes Label, TextField y TextArea. Los métodos de esta clase para dibujar texto son los siguientes:
drawBytes(byte data[ ], int offset, int length, int x, int y);
drawChars(char data[ ], int offset, int length, int x, int y);
drawString(String str, int x, int y);
En estos métodos, los argumentos x e y representan las coordenadas de la línea base. El argumento offset indica el elemento del array que se empieza a imprimir.
Cada tipo de letra está representado por un objeto de la clase Font. Las clases Component y Graphics disponen de métodos setFont() y getFont(). El constructor de Font tiene la forma:
Font(String name, int style, int size)
donde el style se puede definir con las constantes Font.PLAINFont.BOLD y Font.ITALIC. Estas constantes se pueden combinar en la forma: Font.BOLD | Font.ITALIC.
La clase Font tiene tres variables protected, llamadas name, style y size. Además tiene tres constantes enteras: PLAINBOLD e ITALIC. Esta clase dispone de los métodos String getName()int getStyle()int getSize()boolean isPlain()boolean isBold() y boolean isItalic(), cuyo significado es inmediato.
Para mayor portabilidad se recomienda utilizar nombres lógicos de fonts, tales como Serif (Times New Roman), SansSerif (Arial) y Monospaced (Courier).
Líneas importantes en un tipo de letra.

Clase FontMetrics

La clase FontMetrics permite obtener información sobre una font y sobre el espacio que ocupa un char o un String utilizando esa font. Esto es muy útil cuando se pretende rotular algo de modo que quede siempre centrado y bien dimensionado.
La clase FontMetrics es una clase abstract. Esto quiere decir que no se pueden crear directamente objetos de esta clase ni llamar a su constuctor. La forma habitual de soslayar esta dificultad es creando una subclase. En la práctica Java resuelve esta dificultad para el usuario, ya que la clase FontMetrics tiene como variable miembro un objeto de la clase Font. Por ello, un objeto de la clase FontMetrics contiene información sobre la font que se le ha pasado como argumento al constructor. De todas formas, el camino más habitual para obtener esa información es a partir de un objeto de la clase Graphics que ya tiene un font definido. A partir de un objeto g de la clase Graphics se puede obtener una referencia FontMetrics en la forma:
FontMetrics miFontMet = g.getFontMetrics();
donde está claro que se está utilizando una referencia de la clase abstract FontMetrics para refererirse a un objeto de una clase derivada creada dentro del API de Java. Con una referencia de tipo FontMetrics se pueden utilizar todos los métodos propios de dicha clase.
Métodos de la clase FontMetrics.

Clase Color

La clase java.awt.Color encapsula colores utilizando el formato RGB (Red, Green, Blue). Las componentes de cada color primario en el color resultante se expresan con números enteros entre 0 y 255, siendo 0 la intensidad mínima de ese color, y 255 la máxima.
En la clase Color existen constantes para colores predeterminados de uso frecuente: black, white, green, blue, red, yellow, magenta, cyan, orange, pink, gray, darkGray, lightGray. La Tabla muestra algunos métodos de la clase Color.
Métodos de la clase Color.

Imágenes

Java permite incorporar imágenes de tipo GIF y JPEG definidas en ficheros. Se dispone para ello de la clase java.awt.Image. Para cargar una imagen hay que indicar la localización del fichero (URL) y cargarlo mediante los métodos Image getImage(String) o Image getImage(URL, String). Estos métodos existen en las clases java.awt.Toolkit y java.applet.Applet. El argumento de tipo String representa una variable conteniendo el nombre del fichero.
Cuando estas imágenes se cargan en applets, para obtener el URL pueden ser útiles las funciones getDocumentBase() y getCodeBase(), que devuelven el URL del fichero HTML que llama al applet, y el directorio que contiene el applet (en forma de String).
Para cargar una imagen hay que comenzar creando un objeto Image, y llamar al método getImage(), pasándole como argumento el URL. Por ejemplo:
Image miImagen = getImage(getCodeBase(), "imagen.gif")
Una vez cargada la imagen, hay que representarla, para lo cual se redefine el método paint() para llamar al método drawImage() de la clase Graphics. Dicho método admite varias formas, aunque casi siempre hay que incluir el nombre del objeto imagen creado, las dimensiones de dicha imagen y un objeto ImageObserver.
ImageObserver es una interface que declara métodos para observar el estado de la carga y visualización de la imagen. Si se está programando un applet, basta con poner como ImageObserver la referencia this, ya que en la mayoría de los casos, la implementación de esta interface en la clase Applet proporciona el comportamiento deseado. Para más información sobre dicho método dirigirse a la referencia de la API.
La clase Image define ciertas constantes para controlar los algoritmos de cambio de escala:
SCALE_DEFAULT, SCALE_FAST, SCALE_SMOOTH,
SCALE_REPLICATE, SCALE_AVERAGE.
Métodos de la clase Image.


No hay comentarios:

Publicar un comentario