Descarga la aplicación para disfrutar aún más
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/
Compartir