Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Java Imagine jLabel liberare memoria

    salve.
    sto realizzando un programma che mi mostri delle immagini (sono circa 200).
    Ad ogni immagine che mostro la memoria della ram sale di molto fino ad arrivare a 700mb anche se tutte le immagini non pesano piu di 20mb.
    Come posso fare che ad ogni cambio di immagine elimino la vecchia immagine dalla memoria?

    Ora vi posto il codice:

    Codice PHP:
    try {
            if (
    numLezione == && numImages == 0) {
                
    JOptionPane.showMessageDialog(rootPane"Selezionare una lezione.",
                        
    "Errore Selezionare lezione"JOptionPane.WARNING_MESSAGE);
            } else {

                if (
    index == numImages) {
                    
    index 0;
                }

                
    index++;
                
    numSlide.setText(Integer.toString(index) + "/"
                        
    Integer.toString(numImages));
                
    numLez.setText(Integer.toString(numLezione));

                
    img = new ImageIcon(getClass().getClassLoader().getResource(pkgLezione
                        
    "/" "lezione" numLezione "_p" index ".jpg"));
                
    lettoreImg.setIcon(img);

            }
        } catch (
    Exception ex) {
            
    JOptionPane.showMessageDialog(rootPane"Si è verificato un errore"
                    
    "imprevisto! \n Contattare il fornitore del software",
                    
    "Errore imprevisto"JOptionPane.WARNING_MESSAGE);
        } 
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Java Imagine jLabel liberare memoria

    Originariamente inviato da sysoftware
    Come posso fare che ad ogni cambio di immagine elimino la vecchia immagine dalla memoria?

    codice:
    img = new ImageIcon(getClass().getClassLoader().getResource(pkgLezione
                        + "/" + "lezione" + numLezione + "_p" + index + ".jpg"));
    Il punto sta tutto lì, nel come viene caricata la immagine.

    ImageIcon è una classe che incapsula semplicemente un java.awt.Image e permette di disegnare questa immagine nei componenti compatibili perché implementa Icon.

    Nel codice sopra però è stato usato il costruttore ImageIcon(URL location). Il caricamento vero e proprio della immagine però è demandato al "toolkit" (java.awt.Toolkit), in particolare al suo metodo getImage(URL)

    La questione fondamentale: il getImage di Toolkit sfrutta un sistema di "caching" interno delle immagini. A parità di filename o URL (a seconda della versione del metodo) restituisce lo stesso identico oggetto Image. Ed è chiaro che per fare ciò ha bisogno di una mappatura in memoria e di tenere referenziate le immagini!

    Soluzione: evitare di usare (anche indirettamente) il getImage. E usare invece il createImage di Toolkit.

    1) Si ottiene il Toolkit (è una unica istanza, c'è il metodo "factory" in Toolkit stesso)
    2) Si usa il createImage(URL url) (e passi la risorsa esattamente come hai già fatto)
    3) Si istanzia il ImageIcon usando il suo costruttore ImageIcon(Image image)

    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    se non ti dispiace mi puoi fare un esempio?
    grazie

  4. #4
    ho fatto in questo modo:

    Codice PHP:
    Image img2 Toolkit.getDefaultToolkit().createImage(
                            
    getClass().getClassLoader().getResource(pkgLezione
                            
    "/" "lezione" numLezione "_p" index ".jpg"));
                
                
    img = new ImageIcon(img2); 

    credo vada bene adesso la memoria xo arriva a 100 mb.
    Non ce un metodo migliore per non farla alzare cosi?
    grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sysoftware
    se non ti dispiace mi puoi fare un esempio?
    grazie
    I 3 passi:

    codice:
    Toolkit toolkit = ToolkitgetDefaultToolkit();
    Image img = toolkit.createImage(tuoUrlRisorsa);
    ImageIcon icon = new ImageIcon(img);
    Naturalmente è compattabile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    ho fatto in questo modo:

    Codice PHP:
    Image img2 Toolkit.getDefaultToolkit().createImage
                            
    getClass().getClassLoader().getResource(pkgLezione 
                            
    "/" "lezione" numLezione "_p" index ".jpg")); 
                 
                
    img = new ImageIcon(img2); 
    credo vada bene adesso la memoria xo arriva a 100 mb.
    Non ce un metodo migliore per non farla alzare cosi?
    grazie

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sysoftware
    credo vada bene adesso la memoria xo arriva a 100 mb.
    Non ce un metodo migliore per non farla alzare cosi?
    grazie
    Ora non c'è più lo "spreco" del caching delle immagini. Ma come funziona il tuo programma, cosa usa di altre risorse e come le gestisce .... non lo so.

    Tra l'altro i 100 MB che dici sono riferiti a cosa? Al heap della JVM? A quello che vedi in un task manager?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    a quello che veno del monitor dei processi su linux.

    il codice è cosi:

    all inizio del programma creo delle variabili e dei riferimenti accessibili a tutto il codice:

    Codice PHP:
    String pkgLezione "";
        
    int numLezione 0;
        
    int numImages 0;
        
    int index 0;
        
    Image img;
        
    ImageIcon imgIcon
    poi al click del pulsante avanti si genera questo:
    Codice PHP:
    img Toolkit.getDefaultToolkit().createImage(
                            
    getClass().getClassLoader().getResource(pkgLezione
                            
    "/" "lezione" numLezione "_p" index ".jpg"));
                    
                    
    imgIcon = new ImageIcon(img);
                    
                    
    lettoreImg.setIcon(imgIcon); 
    Dimmi se puo andare bene e se faccio bene a creare delle variabili e dei riferimenti ad inizio programma accessibili a tutti.

    Questo è un programma con delle slide del corso di java che stiamo facendo e quindi ancora non sono esperto


    Grazie

  9. #9
    il codice è cosi:

    all inizio del programma creo delle variabili e dei riferimenti accessibili a tutto il codice:

    Codice PHP:
    String pkgLezione "";
        
    int numLezione 0;
        
    int numImages 0;
        
    int index 0;
        
    Image img;
        
    ImageIcon imgIcon
    poi al click del pulsante avanti si genera questo:
    Codice PHP:
    img Toolkit.getDefaultToolkit().createImage(
                            
    getClass().getClassLoader().getResource(pkgLezione
                            
    "/" "lezione" numLezione "_p" index ".jpg"));
                    
                    
    imgIcon = new ImageIcon(img);
                    
                    
    lettoreImg.setIcon(imgIcon); 
    Dimmi se puo andare bene e se faccio bene a creare delle variabili e dei riferimenti ad inizio programma accessibili a tutti.

    Questo è un programma con delle slide del corso di java che stiamo facendo e quindi ancora non sono esperto


    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.