Ti posto tutto il file. Ti indico la riga 65. C'è un commento scritto dal ragazzo che ha fatto la classe in un progetto precedente, te lo lascio se può esserti utile.
codice:
package control;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.TreeMap;
import javax.imageio.ImageIO;
public class CImmagini
{
private static CImmagini unicaIstanza = null;
private TreeMap<String,Image> icone;
public CImmagini()
{
//istanzio icone
this.icone = new TreeMap<String,Image>();
//prelevo la lista (stringhe) dei files presenti nella cartella presentation/icone
File f = new File(this.getClass().getResource("/presentation/icone").toString().substring(6));
String[] arrayNomiFiles = f.list();
//inserisco tutte le icone attraverso un ciclo "intelligente" che sfrutta la conoscenza dei files presenti in presentation/icone
for(int i=0; i<arrayNomiFiles.length; i++) //RIGA 65
{
try {this.icone.put("/presentation/icone/"+arrayNomiFiles[i], ImageIO.read(getClass().getResource("/presentation/icone/"+arrayNomiFiles[i])));}
catch (IOException ex) {System.out.print("ERRORE di lettura dell'icona\n");}
}
}
//metodo di classe che si occupa di recuperare il puntatore all'unica istanza della classe
public static CImmagini istanza()
{
if (unicaIstanza == null) unicaIstanza = new CImmagini();
return unicaIstanza;
}
//metodo per ottenere un'icona
public Image getImage(String relativePath) {return this.icone.get(relativePath);}
}
/** * * @author Alessandro
*
* Classe di FONDAMENTALE importanza per le PRESTAZIONI dell'applicazione. Premesso che:
* - l'applicazione è composta da IMMAGINI, di due tipi
* • A) relative alla grafica ovvero all'interfaccia del programma (icone, pulsanti, sfondi di Panel, ecc.)
* • B) contenenti informazioni e dunque prelevate dal DB (locandine degli spettacoli, loghi dei cinema, foto dei cinema)
* - il tipo A è preponderante rispetto al tipo B, ed inoltre non è il risultato di una query pertanto il suo utilizzo è CERTO e dunque PREVEDIBILE
* - ogni componente che utilizza il tipo A prelevava le immagini (nella versione precedente di questa applicazione) attraverso la libreria ImageIO
* ovvero LEGGENDO DA FILE OGNI volta che il componente veniva istanziato
* - poteva capitare benissimo (vedi schermata PIFOrario) che 50 istanze dello stesso componente (ad esempio il pulsante per il GIORNO) ogni volta
* che venivano istanziate (50 istanze) leggessero da file, dallo STESSO file!!! (50 letture dallo stesso file)
* - la lettura da FILE è lenta, anche più di un accesso al DB
* - l'applicazione risultava molto lenta nel passaggio da una schermata all'altra e nell'interazione con l'utente
*
* L'idea che mi è venuta e la conseguente sua realizzazione sono descritte dai seguenti punti:
* • le immagini utilizzate sono TANTE (attualmente 207 ma potrebbero raggiungere anche 400) e PICCOLE (mediamente 20-30 KB)
* • perchè non caricarle tutte in RAM all'avvio (30KB x 400 = 12 MB) e renderle disponibili, invece di leggerle da file ogni volta?
* • per far ciò è necessaria una classe (QUESTA) avente unica istanza che alloca tutto in RAM la prima volta e poi, su richiesta, fornisce l'imma-
* gine desiderata
* • la struttura dati più consona al nostro caso è una TreeMap <chiave, valore> in cui
* - <chiave> = stringa contenente il percorso RELATIVO dell'immagine (ES.: "/presentation/icone/pulsante_avanti.png"), questo per evitarMI di es-
* sere costretto ad andare a modificare tutte le classi dove si usava il percorso relativo per individuare l'immagine
* - <valore> = l'immagine desiderata
* • tale struttura dati sfrutta gli algoritmi sugli alberi binari di ricerca (BST) per restituire un elemento con getElemento(chiave x) in tempo
* O(logn) dove n è la dimensione dell'input (nel nostro caso n = 400 => t = log400 = circa 9-10 colpi di clock!!!!)
* • si tratta semplicemente di leggere da file tutte le immagini UNA SOLA VOLTA (avvio del programma). Quali immagini? TUTTE quelle contentute nel-
* la cartella /presentation/icone (farò un ciclo per questo)
* • dal momento che le classi che costruiscono la grafica sono quelle contenute in presentation.componenti è bastato andare in ciascuna di esse e
* sostituire la lettura da file mediante ImageIO.read(path_relativo) con la chiamata CImmagini.istanza().getImage(path_relativo)
*
* NOTA : le prestazioni sono migliorate del 70-80 % (ho eseguito il test con lo strumento "Profile" di Netbeans)
* NOTA2: "Sì, ma io che cacchio devo fare?" potreste chiedervi a questo punto.
* - beh le classi che costruiscono la grafica sono già pronte,quindi dovete solo utilizzarle (ES.: new backgroundedButton("/presentation/icone/pul-
* sante_avanti.png")
* - se avete la necessità in ualunque momento ed in qualunque classe di ottenere un'immagine di tipo A (ovvero quelle in /presentation/icone) NON
* utilizzate ImageIO.read(path_relativo) ma utilizzate CImmagini.istanza().getImage(path_relativo)
* - se avete la necessità di ottenere un'immagine di tipo B (ovvero quelle del DB) ovviamente potete usare ImageIO
*/
L'albero delle directory è:
codice:
src:
-control
-presentation
-icone
-...
E' uno sbaglio di path relativo?