jueves, 26 de julio de 2007

Cargar una imagen en un JPanel

Aunque me empiezo a acostumbrar a trabajar con el entorno de desarrollo limitado con el que programo en java, limitado al menos en comparación con el de .NET, sigue haciéndome caer en trampas que se considerarían minucias en otros entornos de desarrollo. Por ejemplo, NetBeans carece de un control de imagen propiamente dicho, por lo que, de buenas a primeras, desconocía dónde meter un archivo .jpg. Después de buscar en internet durante un par de horas, descubrí que debía utilizar un JPanel. Mostraré la dinámica de uso, los problemas que pueden surgir y el código final.

1) Hace falta tener en cuenta cómo se organiza un JPanel. El control almacena componentes. Es posible que tenga varios; de hecho, una configuración común es contar con una imagen y con un botón. En mi caso trabajaré con un único componente a la vez, así que necesito eliminar los que contenga, por si se ha llenado en algún otro método.

panelPortada.removeAll();

2) Prefiero evitar llenar la base de datos de archivos .jpg, así que me limito a guardar el nombre del archivo en un nvarchar. Por lo tanto, necesito cargar el nombre de la imagen. Sin embargo, la mayoría de los métodos requieren que les pase la ruta relativa, que puede variar en función de qué distribución se trate. Guardo las imágenes en un directorio Ruta/gestionvideoclub/. Puedo salvar el problema y recurrir al método getResource.

java.net.URL imgURL = Peliculas.class.getResource(txtPortada.getText());

Es importante notar que hace referencia al JFrame en el que trabajamos, que en este caso se llama Peliculas.

3) Puede que no encuentre la imagen, en cuyo caso imgURL contendría null. Si no la encuentra, lanzo un mensaje de aviso, como ya copiaré después.

4) Java obliga a trabajar con objetos ImageIcon, a cuyo constructor se le pasa la ruta válida de la imagen.

ImageIcon icon=new ImageIcon(imgURL);

5) Suele ser necesario escalar la imagen en función del contenedor. Para ello, hay que reparar en que el objeto ImageIcon actúa de contenedor de un objeto Image. Para escalar la imagen, hay que recuperar la imagen primero con el método getImage. La imagen contiene el método getScaledInstance, que hace el resto del trabajo.

icon.getImage().getScaledInstance(panelPortada.getWidth(), panelPortada.getHeight(), java.awt.Image.SCALE_SMOOTH);

6) El JPanel utiliza como componentes principales los del tipo JLabel, en el que introduciremos el ImageIcon instanciado anterior. No estoy seguro de que se trate de un paso obligatorio, pero, por si acaso, establezco las dimensiones del label mediante el método setBounds.

JLabel label=new JLabel();
label.setIcon(icon);
label.setBounds(0,0,icon.getIconWidth(),icon.getIconHeight());

7) Por último, añado el label al panel que hemos puesto en el formulario mediante el método add. Necesito pintarlo de nuevo con el método repaint.

panelPortada.add(label);
panelPortada.repaint();

8) Uno de los motivos por los cuales la imagen podría no mostrarse se debe a que el JPanel está establecido a opaco. Por lo tanto, lo vuelvo transparente mediante el método setOpaque.

panelPortada.setOpaque(false);

Desde la pantalla de diseño, necesitamos indicar qué borde utilizará. Muestra las opciones de la propiedad border.

1 comentario:

Anónimo dijo...

Muchas gracias, fue de gran utilidad. He buscado en varias paginas pero nadie mostraba un ejemplo para un objeto JPanel creado con la paleta de componentes en Netbeans.

Saludos.