Captura de pantalla 2013-02-10 a la(s) 11.45.33Si hay algo que me encanta es realizar graficos en Java, es entretenido y divertido, en lo personal claro, en esta ocasión quiero enseñarles algo muy sencillo de hacer, y es colocarle una imagen de fondo a un JPanel, o a un canvas (AWT), cada vez que se lo comento a algún amigo dice que se ve muy complicado, pero la verdad es muy sencillo de hacer.

Captura de pantalla 2013-02-10 a la(s) 11.23.51

Bien, para este ejercicio e realizado lo siguiente: 3 Paquetes, uno donde tengo la Gui, que en realidad es solo el JFrame, no contiene nada, uno donde tengo una clase llamada CustomPanel, y otro paquete donde coloqué la imagen, con esto, vamos a poder trabajar tranquilamente y sin ningún problema.

Lo primero que vamos a hacer, y en realidad lo único relevante, será redefinir el método paint de la clase JPanel, bueno, esto es sencillo, para esto hemos creado la clase CustomPanel, la clase CustomPanel es una clase que hace uso de la herencia para tomar todas las propiedades del JPanel original, o de unCanvas si asi se requiere, bueno, pero en este ejemplo vamos a trabajar con un JPanel para que no haya confusiones ni nada, bien, entonces, lo primero que haremos en la clase es agregarle el extends JPanel junto al nombre de la clase, esto hará que herede todo lo comentado anteriormente de la clase JPanel.

public class CustomPanel extends JPanel{

}

Bien, una vez hecho esto, lo que haremos será crear un objeto de tipo Image con nuestra imagen, la cual se encuentra alojada en un paquete dentro de nuestro proyecto, esto ya lo habíamos hecho con anterioridad en un post anterior, así que procederemos con el código, la unica diferencia es que en esta ocasión colocare el objeto Imagen como variable de alcance de clase.

public class CustomPanel extends JPanel{    
    private URL url = getClass().getResource("/img/java.png");
    Image image = new ImageIcon(url).getImage();
}

Como verán, ya tenemos el objeto image, el cual será el que dibujaremos como fondo en el JPanel, ahora solo nos queda redefinir el metodo paint del nuevo panel (CustomPanel), para esto creamos el metodo.

public class CustomPanel extends JPanel{  
    private URL url = getClass().getResource("/img/java.png");
    Image image = new ImageIcon(url).getImage();

    @Override
    public void paint(Graphics g){
    }    
}

Ahora bien, por ultimo, solo nos queda realizar el dibujo de la imagen, esto lo haremos con la instrucción g.drawImage que nos proporciona la libreria Graphics, ahora bien, el drawImage contiene varios constructores, el que nos interesa es el que recibe cinco parámetros, el primero, es el objeto image que va a dibujar, el segundo es la coordenada X de donde empezará el dibujo, recuerden que a la hora de hacer gráficos en java la coordenada Y esta invertida, es decir, si trazamos una línea de arriba abajo, Y en lugar de ir disminuyendo irá aumentando, el tercer argumento será el máximo de largo que tendra nuestra imagen, ahí como recomendación introduzcan getWidth(), que será el máximo del tamaño del panel, y en el cuarto será getHeight(), que representa el máximo de alto que tendra nuestro fondo, el ultimo parámetro representa el objeto sobre el cual se dibujará la imagen, es decir, nuestro CustomPanel(por eso el this), por ultimo, tenemos un setOpaque(False), este parametro es para que cuando nosotros coloquemos objetos sobre nuestro panel, este los muestre, si no colocamos la instrucción, nuestro panel siempre se verá por encima de los demas objetos, y por ultimo, tendremos que hablar al método de la super clase paint, para que en dado caso caso que agreguemos elementos a nuestro panel recuerde siempre pintarlos, ya que actualmente al estar reescribiendo el método no lo estamos haciendo.

public class CustomPanel extends JPanel{    
    private URL url = getClass().getResource("/img/java.png");
    Image image = new ImageIcon(url).getImage();

    @Override
    public void paint(Graphics g){
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        g.setOpaque(False);
        super.paint(g);
    }
}

Y listo, técnicamente con esto, tenemos un nuevo Panel que tiene todas las propiedades de un JPanel común, pero con un fondo, bien, ahora solo nos queda una cosa,antes de probar la clase, tenemos que hacer dos cosas, primero que nada, hay que darle clic a nuestro proyecto y clickear en «limpiar y construir», esto para que genere el jar necesario e introdusca la imagen, ahora, si posteriormente la cambian, tendran que volver a darle «limpiar y construir», ahora, esto no es todo, daremos click derecho a la clase CustomPanel y seleccionaran «compilar», despues de que compilen, jalen su clase hacia su JFrame como si fuera un componente de Swing y si todo sale bien verán como desde que el panel se posiciona en el JFrame, ya tieneel fondo que ustedes seleccionaron, solo ajustenlo a la ventana y listo. xD