jueves, 8 de marzo de 2012

Ventana con imagen de Fondo


Buenas a todos.

Con esta entrada os quiero a enseñar a crear una simple ventana que contendrá un fondo que será una imagen, la que nosotros queramos.

Para este caso vamos a usar las siguientes clases:

Principal()
Ventana()
FondoVentana()

Las tres clases las vamos a poner en el mismo paquete, el paquete por defecto.

Empezamos por Principal:


Principal tendrá que llamar a Ventana, crearla, decirle que se haga visible y en este caso he puesto que cuando cerremos dicha ventana
se cierre todo el proceso del JFRAME.

El código sería el siguiente:


import javax.swing.JFrame;

public class Principal {

public static void main(String[] args) {

Ventana v = new Ventana();
v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
v.setVisible(true);
}

}


Seguro que nos va a saltar varios errores, el primero de ellos puede ser que no hayáis importado swing.JFrame. El otro y más claro va a ser que no
podemos instanciar o crear Ventana, puesto que todavía no la hemos creado.

Ahora vamos con Ventana.

Para usar las propiedades de una Ventana, poder crearla, etc.., en Java necesitamos crear una clase que herede de JFrame. Tenemos que indicarle un
tamaño, un título (opcional), también podemos indicarle pero ya es también opcional si queremos bordes, si el usuario puede maximizar o minimizar, etc...
pero no voy a profundizar mucho más puesto que si estamos en una clase que hereda de JFRAME con poner this. saldrá todas las propiedades, funciones, procedimientos
y argumentos que puede admitir JFRAME.

El código sería algo así:


import javax.swing.JFrame;

public class Ventana extends JFrame {

private FondoVentana fondo;

public Ventana(){

this.setLayout(null);
this.setTitle("Mi ventana de entrada");
this.setBounds(40,40,600,400);
//quitar marcos (adornos)
//this.setUndecorated(true);


//pone la ventana en el centro
this.setLocationRelativeTo(null);

fondo = new FondoVentana();
this.add(fondo);

}
}


Simplemente heredamos de JFRAME, le indicamos que el layout se nulo, un título, un tamaño, lo centramos y luego le añadimos el fondo que todavía no hemos
creado.

Decir que con setBounds siempre los valores son para posicionar en X, Y y luego para Anchura, Altura. En nuestro caso da igual poner 40,40 como coordenadas
X.Y ya que luego aplicamos el setLocationRelativeTo(null) que nos crentrará la ventana sin preocuparnos de saber la resolución de nuestra pantalla.


Ahora vamos con el tercer paquete, pero antes vamos a nuestro Proyecto y creamos la carpeta Imagenes en nuestro proyecto. Buscamos una imagen para nuestro
fondo, lo suyo sería que tuviera las mismas proporciones que la ventana (600x400 pixeles) para que encaje bien, aunque si es mayor no pasa nada, cubrirá
solo la parte que pueda.

Ahora vamos con FondoVentana().

FondoVentana será un JDesktopPane. Es decir un panel de escritorio, o lo que es más conocido para nosotros un papel tapiz. Lo único que haremos en esta clase
es heredar de JDestopPane y cargar una imagen que estará en "/imagenes/nombrefondo.extension"


Vamos con su código:


import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JDesktopPane;

public class FondoVentana extends JDesktopPane {

private Image imagen;

public FondoVentana() {

this.setLayout(null);
this.setToolTipText("Ventana Principal");
this.setBounds(0, 0, 600, 400);

try {
imagen=ImageIO.read(getClass().getResource("/imagenes/fondoppal.png"));
}
 catch (IOException e) {
e.printStackTrace();
}

}

public void paintComponent(Graphics g){

super.paintComponent(g);
g.drawImage(imagen, 0, 0, getWidth(), getHeight(), this);
setOpaque(false);
}

}


Con esto ya tendremos nuestra Ventana lista con un fondo.

Espero que os haya servido de ayuda.

Un saludo.




4 comentarios:

  1. Vale muy bueno, pero ahora como hago para diseñar en ese JFrame?? como hago para agregar JButton y JLabel en esa ventana??

    funciona bien el código, buen trabajo.

    ResponderEliminar
  2. Buenas tardes, perdona la espera, no me llegó un avíso de que había un comentario.

    Para agregar por ejemplo, un JButton, instancias el objeto y luego lo añades al lienzo.

    Tendría que quedar algo así (Esto en fondoVentana por ejemplo) :


    JButton btbusqueda= new JButton("Buscar"); // crear el Objeto
    btbusqueda.setBounds(500, 50, 100, 25); // con esto le das tamaño a tu gusto


    this.add(btbusqueda); //añades al fondo el botón

    Espero que te sirva,

    Un saludo.

    ResponderEliminar
  3. me sale eso, que significa??

    Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at FondoVentana.(FondoVentana.java:19)
    at Ventana.(Ventana.java:9)
    at Principal.main(Principal.java:7)

    ResponderEliminar
  4. Disculpa utilice el codigo en una ventana que ya habia hecho con botones y todo pero si me sale la imagen pero ya no salen los botones :/

    ResponderEliminar