miércoles, 22 de enero de 2014

Como redimensionar Imagen en Java

Hola, para complementar la entrada anterior sobre imágenes en Java, regreso nuevamente con un ejemplo simple y rápido pero tal vez muy útil al momento de personalizar nuestras aplicaciones....

En esta entrada veremos como poner una imagen de fondo y re-dimensionarla con respecto al tamaño de la ventana.....Veamos......


El Ejemplo.

El ejemplo es muy simple, tan solo vamos a crear una ventana con un titulo y una imagen que servirá como fondo para nuestra aplicación, esta imagen cambiará su tamaño a medida que le maximicemos o re-dimensionemos el tamaño de la ventana........

Por defecto vamos a definir que la ventana sea igual al tamaño de la pantalla de nuestro pc......

La Aplicación.

La Aplicación la dividiremos en 3 paquetes, uno de imágenes, otro el paquete principal con la clase que posee el método main y un paquete ventana correspondiente a la parte gráfica del sistema.

En este ultimo tendremos la ventana principal y una clase Contenedora donde alojaremos la imagen y los demás componentes que le queramos vincular...


Clase Principal.

Como lo mencionamos y como es común en la gran mayoría de ejemplos, tenemos la clase Principal donde se aloja el método main con el llamado inicial del sistema, desde aquí instanciamos la clase VentanaPrincipal....
public class Principal {
   public static void main(String[] args) {
    /**Declaramos el objeto*/
    VentanaPrincipal miVentanaPrincipal;
    /**Instanciamos el objeto*/
    miVentanaPrincipal= new VentanaPrincipal();
    /**Hacemos que se cargue la ventana*/
    miVentanaPrincipal.setVisible(true); 
  }
}


Clase VentanaPrincipal.

Esta clase corresponde a la Ventana de la aplicación, inicialmente es una ventana vacía, sin embargo y mediante la instancia de la clase Panel, cargamos el panel donde se define la imagen de fondo.....
public class VentanaPrincipal extends JFrame{
 
private Dimension tamañoPantalla;
private Rectangle pantalla;
public ImageIcon icono;
Panel miPanel;
 
public VentanaPrincipal(){
 /**Asigna un titulo a la barra de titulo*/
 setTitle("CoDejaVu : Imagenes en Java");
 /**tamaño de la ventana en caso de que no se tome
  * el tamaño por defecto*/
  setSize(500,520);
  /**pone la ventana en el Centro de la pantalla*/
  setLocationRelativeTo(null);
  this.setLocationRelativeTo(null);
  /**capturamos el tamaño de la pantalla el pc y lo asignamos
  * al tamaño de la ventana*/
  tamañoPantalla= Toolkit.getDefaultToolkit().getScreenSize();
  pantalla=new Rectangle(tamañoPantalla); 
  setBounds(pantalla);
  /**permite iniciar las propiedades de los componentes*/
  iniciarComponentes();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

private void iniciarComponentes() {
  miPanel=new Panel();
  this.setContentPane(miPanel);
 }
}

La ventana tiene por defecto unas propiedades para su tamaño, sin embargo también se define una propiedad que toma el tamaño de la pantalla para asignárselo a la ventana, en caso de que esto falle, se toma el valor por defecto....

Clase Panel.

Tal vez esta sea la clase mas importante de nuestra aplicación, aquí vemos que se puede crear toda una interfaz gráfica en paneles que pueden ser cargados en una sola ventana, en ejemplos anteriores vimos que podíamos ocultar paneles creados en la misma clase, aquí hacemos lo mismo pero con una clase independiente (todo gracias a tratar el panel como un objeto aparte).....
public class Panel extends Container{
 
public ImageIcon icono;
public JLabel labelTitulo;
 
public Panel(){
 icono = new ImageIcon (getClass().getResource("/imagenes/portada.jpg"));
      
 labelTitulo= new JLabel();
 labelTitulo.setFont(new java.awt.Font("Tahoma", 0, 28));
 labelTitulo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
 labelTitulo.setForeground(new java.awt.Color(255, 255, 255));
 labelTitulo.setText("IMAGEN DE FONDO");
 labelTitulo.setBorder(javax.swing.BorderFactory.createBevelBorder
    (javax.swing.border.BevelBorder.LOWERED));
 labelTitulo.setBounds(20, 10, 300, 40);
 add(labelTitulo);
} 
 
public void paint (Graphics g)
 {
   Rectangle r = g.getClipBounds();
   g.setColor(this.getBackground());
   g.fillRect (r.x, r.y, r.width, r.height);
   g.drawImage (icono.getImage(), 0, 0, this.getWidth(),
   this.getHeight(), this.getBackground(), this);
   super.paint(g);
  }
}

como vemos, esta clase extiende de la clase Container permitiendo usar las propiedades que definen el tamaño de la imagen asignada como fondo, esto lo hacemos mediante el método paint() que calcula el tamaño y coordenadas de la imagen...........
public void paint (Graphics g)
 {
   Rectangle r = g.getClipBounds();
   g.setColor(this.getBackground());
   g.fillRect (r.x, r.y, r.width, r.height);
   g.drawImage (icono.getImage(), 0, 0, this.getWidth(),
       this.getHeight(), this.getBackground(), this);
   super.paint(g);
  }

También vemos que vinculamos un componente JLabel, de esta manera podríamos vincular cualquier cantidad de componentes como botones, áreas entre otros y trabajarlos normal como se ha venido haciendo pero manejándolos en clases aparte, cargándolos después en la ventana principal....

Y Listo, como vimos es un ejemplo muy simple, todo el código fuente está en la entrada, sin embargo anexo el enlace de descarga por si lo quieren validar......

Mas adelante continuaremos trabajando con paneles independientes como útil alternativa en nuestros desarrollos, así como el trabajo con layouts para el re-dimensionamiento de componentes.....


Descarga.

Como es costumbre en el enlace de descarga se encuentra el archivo .rar con la aplicación, solo es cuestión de descomprimir y abrir con Eclipse y listo.......si usas NetBeans te interesará esta entrada con un vídeo paso a paso de como abrirlo en el......... recuerden que es gratis, nada cuesta opinar, compartir o agradecer :) 




También te podría Interesar.


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir
 y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

13 comentarios:

  1. Muy buen aporte amigo!
    Gracias y saudos!

    ResponderEliminar
    Respuestas
    1. Alejandro muchas gracias por comentar, me alegra que te gustara ;) Saludos..

      Eliminar
  2. carnal me podras ayudar, lo que pasa es que busco dibujar una figura X, pero mi problema es que, quiero que aparesca la figura donde yo ponga el puntero del mouse, si mi puntero del mouse esta en el centro que ahi se plante mi figura, pero que si pongo mi puntero en una esquina se borre esa figura y se pase a la esquina donde esta el puntero, digamos que necesito saber como le hago para que la figura aparesca en la ubicacion del puntero del mause

    ResponderEliminar
  3. package collage;
    import java.awt.Image;
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    import javax.swing.JPanel;


    public class collage extends JFrame {
    private JPanel panelImagen;
    private Icon img,img2,img3,img4,img5,img6,img7,img8,img9,img10;
    private JLabel LbImagen;

    public collage(){
    this.setTitle("imagen en java");
    this.setSize(400,400);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocation(500,10);
    imagen();

    }
    public void imagen (){
    this.setLayout(null);
    img = new ImageIcon(getClass().getResource("imagenes/a.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/b.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/c.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/d.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/e.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/f.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/g.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/h.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/i.jpg"));
    img = new ImageIcon(getClass().getResource("imagenes/j.jpg"));

    add(panelImagen = new JPanel ());
    add(LbImagen = new JLabel (img));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img2));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img3));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img4));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img5));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img6));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img7));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img8));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img9));
    LbImagen.setBounds(90,10,200,250);
    add(LbImagen = new JLabel (img10));
    LbImagen.setBounds(90,10,200,250);

    panelImagen.add(LbImagen);
    panelImagen.setBounds(0,0,500,300);

    }
    public static void main(String[] ar) {
    collage collag =new collage ();
    collag.imagen();
    }
    }

    podrias ayudarme tengo que hacer un colage

    ResponderEliminar
  4. Saludos, me pereguntaba si es posible cambiar los valores de ancho y alto introduciendo valores en textfields, lo he estado intentando pero por mas que intento no puedo lograrlo

    ResponderEliminar
  5. Muchas Gracias por tu aparte amigo eres un Crack

    ResponderEliminar
  6. soy nuevo programando en java y trato de colocar una imagen de fondo en mi pantalla pero la imagen se redimenciona pero el JLabel no

    ResponderEliminar
  7. Gran aporte. Muchas gracias por compartir. Saludos

    ResponderEliminar
  8. Hola amigo, tengo una enorme duda he tratado de crear mediante POO una clase con su constructor JFrame y JPanel pero no he podido hacer que entren las dos a la hora de correr el código me salen 2 ventanas una del júrame y una de jpanel por que me esta pasando esto podrías ayudarme con un pequeño vídeo tutorial explicando tal ves sea duda de alguien mas

    ResponderEliminar
  9. me ayudo , me faltaba poner esas indicaciones en el drawImage

    ResponderEliminar
  10. g.drawImage (Imagen, 0, 0,this.getWidth(),this.getBounds().height, null);
    en esa sentencia, a que hace referencia el this?

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!