2013-02-26 13 views
5

Mam problem z ładowaniem obrazów do mojej aplikacji. Próbuję utworzyć prostą przeglądarkę obrazów. Po lewej mam listę folderów. Po kliknięciu nazwy folderu na liście obrazy powinny pojawić się po prawej stronie (okienko przepływu). Każdy obraz jest w HBox z ramką. Ale ja dostaję błąd tak szybko:JavaFX - Ładowanie zdjęć i problemów z pamięcią

java.lang.outofmemoryerror java heap space 

Spojrzałem na menedżera zadań - gdybym załadować tylko 6 zdjęć aplikacja zajmuje 500MB pamięci! I jeszcze jedno - jeśli zmienię folder na liście, pamięć pozostanie zajęta. Przy wyborze innego folderu Tworzę nową flowPane

flowPane = new FlowPane(); 

Więc stary ze wszystkimi ImageViews powinny być usunięte przez śmieciarza, prawda?

Jak skutecznie zarządzać obrazami w mojej aplikacji?

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

Mam ten sam problem :( – Xdg

Odpowiedz

0

Mam podobny problem z pamięcią w JavaFX, ale związany z metodą setStyle. Zanalizowałem użycie sterty i odkryłem, że obiekt StyleHelper zachowuje wszystkie odniesienia do wszystkich stylów ustawionych metodą setStyle (wiele instancji HashMap z głównym GC w com.sun.javafx.css.StyleManager $ Holder). Może to być problem, gdy styl często się zmienia.

Spróbuj skomentować boxNaFotke.setStyle (styl); linię i sprawdź, czy to pomaga.

3

W przypadku skalowania Image przy użyciu constructor ilość potrzebnej pamięci zostanie znacznie zmniejszona.

Niektóre przykład z dokumentacji:

// załadować obraz i zmienić jego rozmiar do 100x150 bez zachowania oryginalnych proporcji
// Obraz znajduje się w my.res pakietu ścieżce klasy
Image image2 = new Image("my/res/flower.png", 100, 150, false, false);

// załadować obraz i zmienić jego rozmiar do szerokości 100, przy jednoczesnym zachowaniu jego
// oryginalne proporcje, używając szybciej filtrowanie meto d
// Obraz jest pobrać z adresu URL dostarczonego przez protokół http
Image image3 = new Image("http://sample.com/res/flower.png", 100, 0, false, false);