Caricamento di immagini

DOMANDA:

Come posso caricare delle immagini in un'interfaccia grafica Java?


RISPOSTA:

Per caricare le immagini in un'interfaccia Java, è possibile utilizzare le classi JFrame, JPanel BufferedImage per effettuare il load vero e proprio.
Questa soluzione è molto più adeguata e flessibile del caricamento di icone descritto in questo post. Nell'esempio presentato vedremo infatti come posizionare l'immagine tramite variabili e come renderizzarla usando l'oggetto Graphics che fornisce numerosi metodi ed effetti applicabili alle BufferedImage (ad esempio la rotazione, traslazione, effetto trasparenza, e tanti altri).


Cominciamo col creare un Pannello.java:

package immagini;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Pannello extends JPanel {
    private static final long serialVersionUID = 1L;

    private BufferedImage image;
    private int x;
    private int y;
 
    // "imagePath" è il path dell'immagine da caricare
    // x e y sono le coordinate dell'immagine
    public Pannello(String imagePath, int x, int y) {
        image = loadImage(imagePath);
        this.x = x;
        this.y = y;
    }

    public void paintComponent(Graphics g) {

        g.drawImage(image, x, y, this);

        repaint();
    }

    // il parametro "path" è il path dell'immagine da caricare
    private static BufferedImage loadImage(String path) {
        BufferedImage bimg = null;
        BufferedImage ret = null;
        try {
            bimg = ImageIO.read(new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
            ret = new BufferedImage(
                bimg.getWidth(), bimg.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = ret.createGraphics();
            g.drawImage(bimg, 0, 0, null);
            g.dispose();

            return ret;
        }
}

Da notare come nella classe Pannello carichiamo l'immagine da visualizzare e le diamo le coordinate desiderate.


A questo punto dobbiamo inserire il pannello appena creato in una Finestra.java:

package immagini;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Finestra extends JFrame {
    private static final long serialVersionUID = 1L;

    public Finestra( ) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI(600, 600);
            }
        });
    }

    private void createGUI(int frameDimX, int frameDimY) {
        this.setSize(frameDimX + 16,frameDimY + 34); // 16,34 = bordi della finestra
        this.getContentPane().add(new Pannello("C:/immagine.jpg", 100, 100));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}



Non ci resta che vedere come funziona il tutto con Test.java (non dimenticate di posizionare un file immagine.jpg nella cartella C:/):


package immagini;

public class Test {

    public static void main(String[] args) {
        new Finestra();
    }
}


Commenti

  1. ciao molto utile...ma se volessi far visulizzare piu di un immagine? grazie 1000

    RispondiElimina
    Risposte
    1. Ciao e grazie a te. Un modo immediato sarebbe quello di trasformare dentro Pannello i campi BufferedImage,x ed y in array e passare nel costruttore di Pannello(String[] imagePaths, int[] x, int[] y) ed utilizzare cicli for per il caricamento ed esposizione delle immagini.
      Invece per una soluzione più pulita puoi comodamente aspettare domani che creerò un nuovo post che risponderà in maniera esaustiva alla tua domanda.
      Resto a disposizione per ulteriori chiarimenti, ciao.

      Elimina
    2. Grazie Giuseppe allora aspetterò domani!

      Elimina
    3. E' pronto adesso: http://lancill.blogspot.it/2012/07/caricamento-di-immagini-multiple.html

      Elimina
  2. Ciao davvero utile...ma come si puo mettere un immagine di sfondo?

    RispondiElimina
    Risposte
    1. Puoi o implementare a mano i livelli usando una matrice di Immagine invece di un semplice array, oppure usando JLayeredPane che ti permette di impostare un pannello di sfondo con l'immagine di sfondo, ed un pannello frontale con il resto dei componenti. Sono sommerso di lavoro, non so se riuscirò ad organizzare un post anche per questo.

      Elimina
    2. Tranquillo grazie! ti chiedo solo...dove lo inserisco (pannello.java, finestra.java...ecc) ?

      Elimina
    3. Per testare questo esempio crei un nuovo progetto, crei un package chiamato "immagini" e crei 3 classi chiamate "Pannello", "Finestra" e "Test" e ci copi dentro tutto il codice che vedi qui, dopo di che avvii "Test.java" come java application ed hai fatto. Ricordati che devi avere un'immagine in "C:/immagine.jpg" altrimenti non funziona.

      Elimina
    4. Scusami ancora ma non ho capito dove deo metter il codice del jlayeredPane nel tuo programma...grazie e scusami ancora per il disturbo

      Elimina
    5. Ciao Mirko, ti suggerisco un paio di link dove puoi trovare documentazione ed esempi validi per utilizzare al meglio i JLayeredPanes: http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html, http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/JLayeredPane.html, http://forum.html.it/forum/showthread/t-1054460.html

      Sono molto semplici e chiari.

      In ogni caso grazie per esserci venuto a trovare, se vuoi unisciti al nostro blog cliccando sul pulsante a destra "UNISCITI A QUESTO SITO" così potrai seguirci sempre.

      Elimina
  3. Ciao ragazzi ma secondo voi è possibile fare in modo che al click in un immagine di quelle visualizzate sulla finestra mi esca tipo una message dialog con scritto "ciao!" per esempio??

    RispondiElimina
    Risposte
    1. Se è piccola risolvi creando un JButton e nel costruttore gli passi l'immagine, a questo punto gli devi definire un ActionListener che chiama JOptionPane.showMessageDialog(...).
      Se è grande o se non vuoi usare JButton, devi implementarlo a mano.
      Preparerò un esempio che sarà pubblicato a breve.

      Elimina
    2. Rettifico: per pausa estiva del blog, la soluzione verrà pubblicata il 1 Settembre. Chi la volesse sapere prima può scrivermi ad ing.cunsolo.giuseppe@gmail.com che gli invio per posta il rar con la soluzione completa.

      Elimina
  4. Scusate ancora ma in quale classe devo laorare per impostare un immagine di sfondo? scusate ancora ma non riesco...grazie dell' aiuto

    RispondiElimina
    Risposte
    1. Dipende da cosa metti sopra all'immagine di sfondo. Se ci metti altre immagini puoi tranquillamente guardare qui http://lancill.blogspot.it/2012/07/caricamento-di-immagini-multiple.html dove spiego come caricare tante immagini: ti basta mettere come prima immagine (nella posizione 0) quella di sfondo.
      Se vuoi scrivere anche del testo, usi sempre lo stesso esempio, ma dentro Pannello.paintComponent(Graphics g) aggiungi subito prima del repaint: g.drawString("ciao", 10, 10);

      Elimina
  5. ciao come faccio a far camminare il mio sfondo ..grazie mille..

    RispondiElimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java