Guida alla programmazione delle GUI, interfacce grafiche in Java 2D - 17: caricare e mostrare le immagini nelle applicazioni
Capitolo 17: Il disegno di base in Java2D: caricare e mostrare le immagini.
Per inserire delle immagini in un pannello (o in altre componenti) è necessario:
- 'caricare' un'immagine da file o da un URL, ossia istanziare un oggetto Image che conterrà i dati prelevati dal file;
- visualizzare l'Image.
Per effettuare il primo passo utilizzeremo la classe Toolkit (lett.: 'cassetta degli attrezzi'), appartenente al package AWT, che mette a disposizione, tra gli altri, i seguenti metodi:
- getImage(String filename) : Image
- getImage(URL url) : Image
che permettono, come è facilmente intuibile, di creare degli oggetti Image a partire da file, memorizzati sul disco o ad un determinato URL.
Durante questa fase, comunque, è consigliabile avvalersi di un particolare oggetto, un MediaTracker, per 'attendere il caricamento' dell'immagine (l'operazione di caricamento richiede tempo ed il programma potrebbe continuare il flusso dell'esecuzione senza visualizzare l'immagine; con un MediaTracker, impediamo che questo avvenga).
Tutto quello che dovremo fare sarà istanziare un MediaTracker aggiungendo, alla lista di 'oggetti media' per i quali bisogna attendere il caricamento, la nostra Image (eventualmente anche più di una, in cascata).
Più in avanti, in questo stesso capitolo verrà mostrato un esempio di codice di caricamento e visualizzazione a video di un'immagine da file, comprendente le fasi di attesa implementante mediante MediaTracker appena descritte.
Ottenuto un oggetto Image, possiamo mostrarlo a video utilizzando il metodo di Graphics :
- drawImage(Image img, int x, int y, ImageObserver observer);
all'interno di paintComponent.
Graphics mette a disposizione anche un altro metodo per disegnare le immagini, simile a quello appena mostrato ma che permette di ridimensionare l'immagine in fase di disegno per farle assumere larghezza width ed altezza height:
- drawImage(Image img, int x, int y, int width, int height, ImageObserver observer); .
Ecco un esempio di istanziazione di un Image e di relativa visualizzazione dell'immagine (la classe qui definita è un pannello, dunque occorrerà definire un main e un Frame in una o più classi aggiuntive per realizzare un esempio completo e funzionante):
class PannelloConImmagine extends JPanel { private Image miaImmagine; public PannelloConImmagine() { miaImmagine = Toolkit.getDefaultToolkit().getImage("immagine.gif"); // Attendo il caricamento dell'immagine (il MediaTracker introduce un 'ritardo', in attesa che gli oggetti ad esso associati vengano caricati) MediaTracker tracker = new MediaTracker(this); tracker.addImage(miaImmagine, 0); try { tracker.waitForID(0); } catch (InterruptedException e) { } }
public void paintComponent(Graphics g) { super.paintComponent(g); //Disegno l'immagine, in questo caso con le dimensioni proprie della stessa, senza ridimensionarla. g.drawImage(miaImmagine,20,20,this); } }
Come potete notare, è possibile - ed anzi è consigliabile - istanziare l'oggetto Image al di fuori di paintComponent, in modo da non dover accedere al file system ad ogni evento della GUI per dover ricreare l'Image, che - anche se ridisegnato - resta comunque sostanzialmente immutato.
|