martes, 29 de enero de 2013

Mostrar Imagenes en Java Parte II

Bueno ahora comenzamos con la segunda parte del Tutorial...
Cuando mostramos una imagen en JAVA y queremos darle movimiento, por ejemplo que al apretar la flecha derecha en el teclado nustra imagen avance JAVA carga la imagen muchas veces lo que ocaciona un tintilleo en la imagen que es bastante molesto...
Para esto existe una Clase que se encarga de cargar en el Buffer del Computador la imagen antes de mostrarla en la pantalla (BufferStrategy) aca esta el codigo con Buffer y sin el para que se entienda la diferencia....


import java.awt.Color;

public class bufferedImage extends JFrame{
      Image imagen1,imagen2;
      InputStream imgStream;
      private BufferStrategy estrategia;//llamo a la clase
      int x;
      public bufferedImage(){
           
            super("BUFFERED IMAGE");
           
            this.setSize(600, 250);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.addKeyListener(kl);//añadimos el key listener
        this.createBufferStrategy(2); //le damos a nuestra ventana la estrategia de guardar 2 veces la imagen en buffer
        x = 20;
        estrategia = getBufferStrategy();//iniciamos nuestra variable con la estrategia
        cargaImagen();
       
       
      }
public void cargaImagen(){
           
            try {
                  imgStream = imagenes.class.getResourceAsStream("img/7.png");
                  imagen1 = ImageIO.read(imgStream);
                  imgStream = imagenes.class.getResourceAsStream("img/0.png");
                  imagen2 = ImageIO.read(imgStream);
                 
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
           

      }

public static void main(String[]arg){
            new bufferedImage();
      }

public void paint(Graphics g){
     
      Graphics g2 = (Graphics2D)g;
      Graphics g3 = (Graphics2D)estrategia.getDrawGraphics();//casteamos la estrategia
      g2.setColor(Color.BLACK);
      g3.fillRect(0, 0, 600, 250);
      g2.drawImage(imagen1, x, 50, 50, 50, null);//imagen sin buffer
      g3.drawImage(imagen2, x, 150, 50, 50, null);//imagen con buffer
      estrategia.show();//mostramos la estrategia
      repaint();
     
}
KeyListener kl = new KeyListener(){
     
     
      public void keyPressed(KeyEvent arg0) {
            int codigo = arg0.getKeyCode();

            if(codigo == KeyEvent.VK_RIGHT)
            {
                  x = x + 10;
            }
           
           
      }
     
      public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub
           
      }

      public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub
           
      }
};

}




Ahora si apretamos la tecla Flecha derecha vemos la diferencia entre las 2 imagenes!! Genial no???


Mostrar Imagenes en Java Parte I

Cuando quieres cargar imagenes en Java existen varios Clases que haran esa tarea por ti pero el problema que a mi como desarrollador se me presento era que las imagenes se veian en el IDE en este caso Eclipse o NetBeans pero al momento de exportar mi programa a JAR (mismo que haya colocado la ubicacion de las imagenes enel Path relativo) no aparecian las imagenes :'( asi que despues de buscar muuuuuuchooo en las WEBS encontre la forma de hacerlo!!!!
Eso es lo que te voy a enseñar ahora....

1º paso .- Vamos a crear una carpeta que aloje nuestras imagenes dentro de nuestro proyecto asi...
En Eclipse abrimos nuestro proyecto, boton derecho sobre SRC, nos vamos a new y elegimos folder


2º paso.- Con nuestra nueva carpeta creada (en mi caso la llame img) le damos click derecho y elegimos la opcion de import, cuando se abra una ventana le damos a FileSystem y le damos a next aca las imagenes....





Luego le damos a Buscar, encontramos en nuestro disco duro la carpeta que contiene nuestras imagenes y le damos a abrir o seleccionar.
 Nos aparecera una ventana con todas las imagenes que tenemos dentro nuestra carpeta, elegimos las que queramos importar y le damos a Finish...


Hecho!!! ahora puedes ver que dentro de la carpeta que te creaste en tu proyecto estan las imagenes que quieres usar!!!




Listo ahora a usar nuestras imagenes con el siguiente codigo....



import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.IOException;
import java.io.InputStream;
import java.awt.Image;


import javax.imageio.ImageIO;
import javax.swing.*;


public class imagenes extends JFrame{
      Image imagen1,imagen2,imagen3; //declaro 3 variables del tipo iamgen
      InputStream imgStream;
     
      public imagenes(){
            super("Imagenes");
            this.setSize(250, 400);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        cargaImagen();
        repaint();
      }
      public void cargaImagen(){
           
            try {
                  imgStream = imagenes.class.getResourceAsStream("img/7.png");//el path debe ser directo img es mi directorio
                  imagen1 = ImageIO.read(imgStream);
                  imgStream = imagenes.class.getResourceAsStream("img/0.png");
                  imagen2 = ImageIO.read(imgStream);
                  imgStream = imagenes.class.getResourceAsStream("img/9.png");
                  imagen3 = ImageIO.read(imgStream);
            } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
      }
      public static void main(String[]arg){
            new imagenes();
      }
      public void paint(Graphics g)
      {
            Graphics g2 = (Graphics2D)g;
            g2.setColor(Color.black);
            g2.fillRect(0, 0, 250, 400);//creo un triangulo negro del tamaño de la ventana para fondo
            g2.drawImage(imagen1, 100, 50, 70, 70, null);//dibujo la imagen x, y, tamaño vertical y horizontal
            g2.drawImage(imagen2, 100, 150, 70, 70, null);
            g2.drawImage(imagen3, 100, 230, 70, 70, null);
      }
     

}




Este es el resultado con mis imagenes...


Ahora lo bueno de esto es que si te creas un JAR (un ejecutable de JAVA) las imagenes estaran dentro de ese ejecutable!!!