Colocar imágenes en JFrame

10 de diciembre del 2022

Colocar imágenes en JFrame con dos métodos distintos JPanel y JLabel
No Image

Creación del proyecto

El primer paso es crear un proyecto nuevo en nuestro IDE de Apache NetBeans o NetNeans. Para este tutorial se creó un proyecto de Java with Ant Java Application.

Método 1. Colocar imagen desde JLabel

Una vez creado colocaremos un JLabel (En el video tutorial se colocó una etiqueta para identificar el control esto es opcional). Una vez creado borramos el texto que aparece por default y ajustamos el label al ancho y alto deseado y nombramos el JLabel para identificarlo, por ejemplo: lblImagen.

Colocar la imagén en el proyecto

En la ruta del proyecto "src" colocar la(s) imagen(es) a utilizar, es posible crear una carpeta y almacenar la o las imágenes "src/imgs".
Para este tutorial he colocado distintas imágenes con diferentes tamaños. (16x16, 24x24, 32x32, 128x128, 256x256, 512x512 y 1080x1080).

Propiedad icon

En las propiedades del JLabel (Clic derecho + Properties) seleccionar la propiedad "icon". En caso que no aparezca revisar si el componente es JLabel y no Label.

Elegir la imagen

Elegimos la imagen a través de esta ventana, seleccionando la carpeta dónde está o están almacenadas. En este caso elegí la imagen "1024x1024".

Resultado

Y ahora ya podemos ver la imagen con este método.


Ventajas:
  • No utilizamos código
  • No hay errores de ruta a menos que la imagen sea removida.

Desventajas:
  • Dependiendo del tamaño del JLabel, de ese tamaño debe ser la imagen, es decir si el JLabel es de 100x100 pixeles debemos colocar una imagen de esas dimensiones, de lo contrario esta se vera muy pequeña o se saldrá del margen y se verá cortada

Colocar imagen desde JLabel con código

Para resolver el problema del punto anterior podemos hacer lo mismo pero a través del código. Es decir partimos del punto"Colocar la imagén en el proyecto" dónde almacenamos las imágenes en el proyecto.

Agregar botón

Agregamos un botón para cambiar/asignar la imagen a través de código. Damos doble clic al botón desde diseño para ir al evento Click del botón.

Código para asignar la imagen

Lo primero es declarar un objeto de tipo Icon e instanciamos el objeto de tipo ImageIcon.

Icon mIcono = new ImageIcon();


Hecho esto dentro del constructor instanciamos una clase ImageIcon.
Icon mIcono = new ImageIcon(new imageIcon());


Dentro del constructor pasamos el recurso, es decir la imagen de la siguiente forma:
Icon mIcono = new ImageIcon(new imageIcon(getClass().getResource("/icons/imagen512x512.png")));

"/icons/imagen512x512.png" es la ruta de la imagen, en su caso colocar la indicada.

Para finalizar ajustamos la imagen con el tamaño que necesitamos, es decir el ancho y alto del JLabel. Esto lo hacemos con las funciones getImage().getScaledInstance(WIDTH, HEIGHT, 0)

El alto y ancho los obtenemos de la siguiente forma: lblImagen.getWidth(), lblImagen.getHeight()

El resultado será el siguiente:


Icon mIcono = new ImageIcon(new ImageIcon(getClass().getResource("/icons/imagen512x512.png")).getImage()

.getScaledInstance(lblImagen.getWidth(), lblImagen.getHeight(), 0));

lblImagen.setIcon(mIcono);

Método 2. Colocar imagen desde JPanel

El segundo método implica más código pero tiene más ventajas. Primeramente colocamos un JPanel en nuestro formulario y le cambiamos el nombre por un nombre que podamos identificar rápidamente ya que lo estaremos usando en el código varias veces. Por ejemplo pnlImage.

Creación de la clase JPanelImage

Luego de crear el JPanel procederemos a crear una nueva clase a la cual llamaremos JPanelImage. Esta clase nos ayudará a colocar la imagen dentro del JPanel.

Una vez creada esta clase añadiremos los imports necesarios para este caso:

import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;


En el nombre de la clase añadiremos la palabra reservada extends para heredar las características de otro objeto, en este caso JLabel. De tal manera que este sea el resultado:

public class JPanelImage extends JLabel


Luego de esto crearemos tres propiedades, la primera sera la ruta o path de la imagen que se desea colocar, el segundo y tercero en ancho y alto que queremos que tenga la imagen dentro del panel.

private final String path;
private int x, y;


En seguida crearemos el constructor de la clase pasando dos parametros, el primero será un objeto de tipo JPanel (para pasar el JPanel que queremos utilizar para colocar la imagen) y el segundo un string al cual llamaremos path o ruta (ruta de la imagen dentro del proyecto). deberia verse dela siguiente forma: public JPanelImage(JPanel panel, String path). Dentro del constructor asignamos estas propiedades a nuestras variables de la siguiente forma:

this.path = path;
this.x = panel.getWidth();
this.y = panel.getHeight();
this.setSize(x, y);


Para finalizar con este paso haremos una sobrecarga a un método llamado Paint utilizando la palabra reservada override pasando como parámetro un objeto de tipo Graphics. Dentro del método instanciamos un objeto tipo ImageIcon y dentro del constructor pasando el recurso (imagen) de la siguiente fotrma: ImageIcon img = new ImageIcon(getClass().getResource(path)); dónde "path" es nuestra variable de la ruta de la imagen. Por ultimo al parámetro Graphics lo usamos para llamar la función drawImage pasando seis parámetros:

  • Imagen: img.getImage() // Imagen recién creada a partir del path
  • x: 0 // No es importante colocamos cero
  • y: 0 // No es importante colocamos cero
  • width: x // Ancho de la imagen
  • heigth: y // Alto de la imagen
  • observer: null // No es importante colocamos cero


La clase completa nos debe de dar el siguiente resultado:

import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
*
* @author L-Code
*/
public class JPanelImage extends JLabel{
private int x, y;
private final String path;

public JPanelImage(JPanel panel, String path) {
this.path = path;
this.x = panel.getWidth();
this.y = panel.getHeight();
this.setSize(x, y);
}

@Override
public void paint(Graphics g) {
ImageIcon img = new ImageIcon(getClass().getResource(path));
g.drawImage(img.getImage(), 0, 0, x, y, null);

}

Asignar la imagen al panel

Por último dentro del código de nuestro JFrameForm específicamente en el constructor instanciamos un objeto de tipo JPanelImage que es la clase que creamos en el paso anterior. Como parámetros pasamos el nombre del JPanel que para el ejemplo colocamos pnlImage y la ruta de la imagen dentro del proyecto. En seguida al pnlImage (o el nombre que hayas colocado) llamamos su función "add" pasando el objeto que acabamos de instanciar y en seguida llamamos la función "repaint()". El resultado deberá ser:

JPanelImage mImagen = new JPanelImage(pnlImagen, "/icons/logo.png");
pnlImagen.add(mImagen).repaint();


En este punto la imagen ya se mostrará al iniciar la aplicación (siempre y cuando la ruta sea válida.) Sin embargo aparecer un fondo color gris, para evitar esto podemos agregar el siguiente código:

pnlImagen.setOpaque(false);
pnlImagen.setBorder(null);
pnlImagen.setBackground(new Color(0,0,0,0));


Y esto es todo!


Ventajas:

  • Podemos colocar componentes dentro del panel, para utilizarlo como fondo.
  • Si se cambia de tamaño el JPanel este adaptará la imagen a ese tamaño.

Desventajas:
  • Para cada imagen que se deseé colocar se debe crear un objeto JPanelImage.

public Imagenes() {

initComponents();
this.setLocationRelativeTo(null); // Centrar la pantalla

JPanelImage mImagen = new JPanelImage(pnlImagen, "/icons/logo.png");
pnlImagen.add(mImagen).repaint();
pnlImagen.setOpaque(false);
pnlImagen.setBorder(null);
pnlImagen.setBackground(new Color(0,0,0,0))
}

L-Code

Si te gusta este contenido te pido que me apoyes suscribiendote a mi canal

Síguenos en Facebook

Si te gusta este contenido te pido que me apoyes suscribiendote a mi canal