Logo Studenta

Grafica_en_Java

¡Estudia con miles de materiales!

Vista previa del material en texto

Taller de Lenguajes II – Año 2012 
1 
 
Java Foundation Classes (JFC) 
 
JFC es el framework que provee clases para implementar la interfaz gráfica de usuario (GUI). Swing 
y Java 2D forman parte de JFC. 
 
Estructura de una Aplicación Gráfica 
Las aplicaciones Java están organizadas en una estructura de paneles como muestra el siguiente gráfico 
 
Estructura de paneles en una aplicación gráfica 
En general en las aplicaciones gráficas, la componente ContentPane es la más empleada, ya que contiene a 
todas las componentes agregadas en nuestro JFrame: 
JFrame miFrame=new JFrame(); 
miFrame.getContentPane().add(new Label(“Hola”)); 
 
La última sentencia también puede ser escrita como: 
miFrame.add(new Label(“Hola”)); 
El método add se encarga de agregar la componente al ContentPane. 
El uso de los otros Pane normalmente resulta transparente al programador, ya que el método add agrega las 
componentes en el Pane adecuado (por ej. un JMenu se agregará al RootPane) 
 
Mecanismo de Pintado 
Componentes Heavyweight (AWT) 
Las actualizaciones de las componentes gráficas se realizan “disparadas por el sistema” o “disparadas por la 
aplicación”. 
Las actualizaciones “disparadas por el sistema” se producen cuando AWT determina que una componente o 
parte de la misma debería actualizarse, entonces se invoca automáticamente al método paint. 
Taller de Lenguajes II – Año 2012 
2 
 
Las actualizaciones “disparadas por la aplicación” se producen cuando el programa ejecuta un repaint. En 
caso de generarse múltiples repaint, AWT se encarga de simplificar el repintado en una sóla invocación que 
contiene todas las áreas involucradas en la actualización. 
Componentes Lightweight (SWING) 
Con algunas excepciones, las actualizaciones se realizan de manera parecida a la mecánica de AWT. 
Las componentes Swing además tienen soporte para doble buffering, lo que mejora la renderización. Por 
defecto el double buffering se encuentra habilitado. 
public boolean isDoubleBuffered() 
public void setDoubleBuffered(boolean o) 
 
El double buffering permite mantener un buffer con la información que se muestra en pantalla (on-screen) y 
un buffer con información actualizada pero aún no visible (off-screen). En el momento de la actualización 
gráfica se vuelca la información del buffer off-screen al buffer on-screen. 
El método paint en las componentes es heredado a través de la jerarquía de clases desde la clase 
Component. Éste método es sobreescrito por JComponent donde se realizan básicamente 3 acciones y en el 
siguiente orden: 
1. paintComponent(Graphics g) 
2. paintBorder(Graphics g) 
3. paintChildren(Graphics g) 
El único método que el programador debería sobreescribir para pintar es el paintComponent, quien realiza 
recursivamente la actualización gráfica de las componentes contenidas en el mismo. 
Si el programador desea hacer un “refresco explícito”, debe invocar al método repaint y no al 
paintComponent directamente. El método repaint está sobrecargado, de modo que no es necesario 
refrescar toda la pantalla, sino que puede especificarse un área delimitada. En caso que el repaint sea 
invocado múltiples veces desde un manejador de eventos, Swing se encargará de realizar el refresco sólo 
una vez. 
 
Java 2D 
Las clases más importantes en Java2D son: 
Image: representa a una imagen como un rectángulo de pixels. 
BufferedImage: subclase de Image que permite operar a nivel de pixel sobre la imagen ya que provee un 
buffer de datos en memoria, lo que además la convierte en una clase más eficiente. Al ser una subclase de 
Image, los métodos de las clases Graphics y Graphics2D que aceptan entre sus argumentos objetos de tipo 
Image también aceptan BufferedImage. 
Un BufferedImage tiene asociado un ColorModel que administra el color y un Raster que: 
Taller de Lenguajes II – Año 2012 
3 
 
� Representa las coordenadas rectangular de la imagen 
� Mantiene datos de la imagen en memoria 
� Permite crear imágenes a partir del buffer de datos 
� Permite acceder a nivel de pixel sobre la imagen 
Ejemplo de uso de Buffered Image: 
 
BufferedImage img = null; 
try { 
 img = ImageIO.read(new File("picture.jpg")); 
} catch (IOException e) { 
} 
 
 
Hay varias formas de crear una instancia de Image. En particular en este ejemplo, se usa la clase ImageIO; el 
método read de la clase ImageIO puede recibir también una URL (la URL la generamos creando la instancia u 
obteniéndola a partir de la invocación a this.getClass().getResource(…) ). 
Una vez que tenemos una imagen en una variable de tipo BufferedImage, podemos modificar determinados 
pixels en la imagen gracias a la colaboración de la clase Graphics. 
 
La clase Graphics 
La clase Graphics es una clase legacy que permite crear y manipular gráficos en una aplicación. La clase 
Graphics2D es una subclase de la clase Graphics y su sucesora; como tal, provee mayor funcionalidad que la 
clase Graphics. En particular el método drawImage es el que nos permite dibujar una imagen y se encuentra 
sobrecargado (puede ser tan simple como dibujar una imagen en una determinada posición, como realizar 
alguna transformación sobre la imagen antes de ser dibujada). El objeto Graphics asociado a un 
BufferedImage nos permitirá dibujar sobre la imagen buffereada. 
BufferedImage off_Image = new BufferedImage(100, 50 ,BufferedImage.TYPE_INT_ARGB); 
Graphics2D g2 = off_Image.getGraphics(); 
g2.setColor(Color.red); //setea el color para dibuj ar 
g2.drawOval(150,50,120,50); //aqui se podría dibuja r una imagen con g2.drawImage(…) 
NOTA: El método drawImage recibe un parámetro “Observer”, el cual es usa para notificar a algún 
“observer” sobre los cambios en la imagen. Salvo casos particulares, puede indicarse en null. 
 
Referencias: 
� Painting in AWT and Swing: http://www.oracle.com/technetwork/java/painting-140037.html 
� Working with Images: http://docs.oracle.com/javase/tutorial/2d/images/index.html 
� http://www.corewebprogramming.com/

Otros materiales