domingo, 13 de diciembre de 2020

Cargar imagen en Java Swing

Para este ejemplo se emplea NetBeans, una imagen jpg y la biblioteca Java Swing. 

 

Estructura del proyecto

Se creo un JFrame que llamará a la imagen, se aprovechar esto para mostrar como llamar a la imagen desde una ubicación externa a la aplicación y desde el mismo JAR de la aplicación.


La estructura es la siguiente: La imagen cat.jgp es:

Llamada desde fuera del JAR

Las líneas de código relevante de todo el JFrame (líneas 10 a 15) son las que declaran el objeto de tipo ImageIcon desde la ruta absoluta o path seguido de un condicional que evalúa si el estado de carga de la imagen es COMPLETO y en cuyo caso procede a borrar el texto del JLabel y asignar la imagen dentro de este.

  1. package images;
  2. import javax.swing.ImageIcon;
  3. public class ImagenView extends javax.swing.JFrame {
  4. public ImagenView() {
  5. initComponents();
  6. //Se carga la imagen en un ImageIcon
  7. ImageIcon icono = new ImageIcon("/NetBeansProjects/Blog/src/images/cat.jpg");
  8. if (icono.getImageLoadStatus() == java.awt.MediaTracker.COMPLETE) {
  9. lblImagen.setText("");
  10. lblImagen.setIcon(icono); // Se coloca en el JLabel
  11. }
  12. }
  13. @SuppressWarnings("unchecked")
  14. // <editor-fold defaultstate="collapsed" desc="Generated Code">
  15. private void initComponents() {
  16. lblImagen = new javax.swing.JLabel();
  17. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  18. setTitle("Cargando imagen");
  19. lblImagen.setText("Sin imagen");
  20. javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
  21. getContentPane().setLayout(layout);
  22. layout.setHorizontalGroup(
  23. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  24. .addGroup(layout.createSequentialGroup()
  25. .addContainerGap()
  26. .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE,
  27. 226, Short.MAX_VALUE)
  28. .addContainerGap())
  29. );
  30. layout.setVerticalGroup(
  31. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  32. .addGroup(layout.createSequentialGroup()
  33. .addContainerGap()
  34. .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE,
  35. 226, Short.MAX_VALUE)
  36. .addContainerGap())
  37. );
  38. pack();
  39. }// </editor-fold>
  40. public static void main(String args[]) {
  41. try {
  42. for (javax.swing.UIManager.LookAndFeelInfo info :
  43. javax.swing.UIManager.getInstalledLookAndFeels()) {
  44. if ("Nimbus".equals(info.getName())) {
  45. javax.swing.UIManager.setLookAndFeel(info.getClassName());
  46. break;
  47. }
  48. }
  49. } catch (ClassNotFoundException | InstantiationException |
  50. IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
  51. java.util.logging.Logger.getLogger(ImagenView.class.getName())
  52. .log(java.util.logging.Level.SEVERE, null, ex);
  53. }
  54. java.awt.EventQueue.invokeLater(new Runnable() {
  55. public void run() {
  56. new ImagenView().setVisible(true);
  57. }
  58. });
  59. }
  60. // Variables declaration - do not modify
  61. private javax.swing.JLabel lblImagen;
  62. // End of variables declaration
  63. }

Llamada desde dentro del JAR

Se requiere de la clase java.net.URL para indicar la ubicación de la imagen y cargarla posteriormente

  1. package images;
  2. import java.net.URL;
  3. import javax.swing.ImageIcon;
  4. public class ImagenView extends javax.swing.JFrame {
  5. public ImagenView() {
  6. initComponents();
  7. //Se carga la imagen en un ImageIcon desde su URL
  8. URL url = getClass().getResource("cat.jpg");
  9. ImageIcon icono = new ImageIcon(url);
  10. if (icono.getImageLoadStatus() == java.awt.MediaTracker.COMPLETE) {
  11. lblImagen.setText("");
  12. lblImagen.setIcon(icono); // Se coloca en el JLabel
  13. }
  14. }
  15. @SuppressWarnings("unchecked")
  16. // <editor-fold defaultstate="collapsed" desc="Generated Code">
  17. private void initComponents() {
  18. lblImagen = new javax.swing.JLabel();
  19. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  20. setTitle("Cargando imagen");
  21. lblImagen.setText("Sin imagen");
  22. javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
  23. getContentPane().setLayout(layout);
  24. layout.setHorizontalGroup(
  25. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  26. .addGroup(layout.createSequentialGroup()
  27. .addContainerGap()
  28. .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE,
  29. 226, Short.MAX_VALUE)
  30. .addContainerGap())
  31. );
  32. layout.setVerticalGroup(
  33. layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  34. .addGroup(layout.createSequentialGroup()
  35. .addContainerGap()
  36. .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE,
  37. 226, Short.MAX_VALUE)
  38. .addContainerGap())
  39. );
  40. pack();
  41. }// </editor-fold>
  42. public static void main(String args[]) {
  43. try {
  44. for (javax.swing.UIManager.LookAndFeelInfo info :
  45. javax.swing.UIManager.getInstalledLookAndFeels()) {
  46. if ("Nimbus".equals(info.getName())) {
  47. javax.swing.UIManager.setLookAndFeel(info.getClassName());
  48. break;
  49. }
  50. }
  51. } catch (ClassNotFoundException | InstantiationException |
  52. IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
  53. java.util.logging.Logger.getLogger(ImagenView.class.getName())
  54. .log(java.util.logging.Level.SEVERE, null, ex);
  55. }
  56. java.awt.EventQueue.invokeLater(new Runnable() {
  57. public void run() {
  58. new ImagenView().setVisible(true);
  59. }
  60. });
  61. }
  62. // Variables declaration - do not modify
  63. private javax.swing.JLabel lblImagen;
  64. // End of variables declaration
  65. }

En ambos casos la salida en pantalla sería:

No hay comentarios:

Publicar un comentario