2016-04-03 73 views
0

我想問問有沒有人知道JavaFX ImageView如何處理圖像清理。 當圖像對象/內存空閒時。JavaFX ImageView - 圖像清理

這是對我造成問題的情況: 我在場景中有兩個「選項卡」位置。這是我的選項卡:父窗格中的按鈕和切換窗格。每個選項卡都有自己的ImageView。在切換窗格之前,我在舊ImageView上顯示null圖像,然後加載新圖像。我期待在切換標籤後,舊ImageView的舊圖像將是免費的,但事實上並非如此。

爲了監視我使用Java VisualVM工具的行爲,並且從中觸發了GC。我還通過HeapDump驗證了對象列表,並且我可以在imageview上調用setImage(null)後確認該事件,舊圖像仍保存在ImageView中,並且不能由GC收集。

我會非常感激如果有人可以建議我如何擺放ImageView來清除舊圖像以節省內存。

下面的代碼顯示了這個問題sutuation:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 


public class IVTestApp extends Application { 

    private String img1 = "http://formaciononline.co/wp-content/uploads/2014/05/aprender-a-programar-en-Java.jpg"; 
    private String img2 = "https://madushan1995.files.wordpress.com/2015/02/java-institute-new-final.png"; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     BorderPane bp = new BorderPane(); 

     BorderPane p1 = new BorderPane(); 
     ImageView iv1 = new ImageView(); 
     iv1.setPreserveRatio(true); 
     iv1.setFitHeight(200); 
     iv1.setFitWidth(300); 
     p1.setCenter(iv1); 

     BorderPane p2 = new BorderPane(); 
     ImageView iv2 = new ImageView(); 
     iv2.setPreserveRatio(true); 
     iv2.setFitHeight(200); 
     iv2.setFitWidth(300); 
     p2.setCenter(iv2); 

     Button tab1 = new Button("tab1"); 
     Button tab2 = new Button("tab2"); 

     tab1.setOnAction(e -> { 
      iv2.setImage(null); 
      iv1.setImage(new Image(img1)); 
      bp.setCenter(p1); 
     }); 

     tab2.setOnAction(e -> { 
      iv1.setImage(null); 
      iv2.setImage(new Image(img2)); 
      bp.setCenter(p2); 
     }); 

     bp.setLeft(new VBox(tab1, tab2)); 

     Scene scen = new Scene(bp); 
     primaryStage.setScene(scen); 
     primaryStage.setWidth(600); 
     primaryStage.setHeight(400); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

//注意: 我的環境是由:Windows 7的x64bit與Java的x86 jdk8u40

回答

0

您可以嘗試使用「空圖像「(例如100%透明的圖像,具有所需的大小 - 易於使用Alpha通道),保證爲空值。這應該取代保存在內存中的圖像,從而使其成爲垃圾收集。

+0

我已經嘗試過但它沒有幫助。 – Wojtek