2013-02-26 15 views
5

Ho un problema con il caricamento delle immagini nella mia applicazione. Sto cercando di creare un semplice browser di immagini. A sinistra ho una lista di cartelle. Dopo aver fatto clic sul nome della cartella nell'elenco, le immagini dovrebbero apparire a destra (riquadro del flusso). Ogni immagine è in un HBox con un bordo. Ma sto errore come questo in fretta:JavaFX - Caricamento immagini e problemi di memoria

java.lang.outofmemoryerror java heap space 

ho guardato il task manager - se carico solo 6 foto l'applicazione prende 500MB di memoria! E un'altra cosa: se cambio cartella nella lista la memoria rimane occupata. Mentre la scelta di un'altra cartella sto creando nuova flowPane

flowPane = new FlowPane(); 

Così il vecchio con tutte le ImageViews deve essere eliminato dal garbage collector, giusto?

Come posso gestire le immagini nella mia app in modo efficace?

for(int i = 0 ; i < zdjecia.length; i++){ 
     ImageView iv2 = new ImageView(); 
     Image image = new Image("file:"+zdjecia[i].getAbsolutePath()); 
     iv2.setImage(image); 
     if(image.getHeight() > image.getWidth()){ 
       iv2.fitHeightProperty().bind(szerokoscZdjecia.multiply(0.8).subtract(6)); 
     }else 
       iv2.fitWidthProperty().bind(szerokoscZdjecia.subtract(6)); 

     iv2.setPreserveRatio(true); 
     iv2.setSmooth(true); 
     iv2.setCache(false); 

     String styl = "-fx-border-color: #b2b3b3;" 
       + "-fx-border-width: 2;"; 

     HBox boxNaFotke = new HBox(); 
     boxNaFotke.prefWidthProperty().bind(szerokoscZdjecia); 
     boxNaFotke.prefHeightProperty().bind(szerokoscZdjecia.multiply(0.8)); 
     boxNaFotke.setAlignment(Pos.CENTER); 
     boxNaFotke.setStyle(styl); 
     boxNaFotke.getChildren().add(iv2); 
     fotki.add(boxNaFotke); 
     flowPane.getChildren().add(boxNaFotke); 
    } 
+0

Ho un stesso problema :( – Xdg

risposta

0

Ho un problema simile con la memoria in JavaFX ma connesso con il metodo setStyle. Ho analizzato l'utilizzo dell'heap e ho scoperto che StyleHelper mantiene tutti i riferimenti a tutti gli stili impostati dal metodo setStyle (molte istanze di HashMap con radice GC in com.sun.javafx.css.StyleManager $ Holder). Potrebbe essere un problema quando lo stile viene spesso cambiato.

Prova a commentare boxNaFotke.setStyle (styl); linea e controllare se aiuta.

3

Se si scala Image utilizzando constructor, la quantità di memoria necessaria verrà ridotta notevolmente.

Qualche esempio dalla documentazione:

// caricare un'immagine e ridimensionare a 100x150 senza mantenere le proporzioni originali
// L'immagine si trova in my.res pacchetto del classpath
Image image2 = new Image("my/res/flower.png", 100, 150, false, false);

// caricare un'immagine e ridimensionare a larghezza di 100 pur mantenendo le proporzioni originali
// , utilizzando metho filtraggio veloce d
// L'immagine viene scaricato dal URL fornito tramite protocollo http
Image image3 = new Image("http://sample.com/res/flower.png", 100, 0, false, false);

Problemi correlati