gpt4 book ai didi

JavaFX ImageView - 图像清理

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:21 25 4
gpt4 key购买 nike

我想问是否有人知道JavaFX ImageView如何处理图像清理。当图像对象/内存空闲时。

以下情况给我带来了问题:我的场景中有两个“选项卡”位置。这是我的选项卡:父 Pane 中的按钮和切换 Pane 。每个选项卡都有自己的 ImageView。在切换 Pane 之前,我在旧 ImageView 上清空图像,然后加载新图像。我原以为切换选项卡后旧 ImageView 中的旧 Image 将是免费的,但事实上并非如此。

为了监视行为,我使用了 Java VisualVM 工具,并从中触发了 GC。我还通过 HeapDump 验证了对象列表,并且我可以确认在 imageview 上调用 setImage(null) 后的事件,旧图像仍然保留在 ImageView 中并且无法被 GC 收集。

如果有人能建议我如何触发 ImageView 清除旧图像以节省内存,我将非常感激。

下面是显示此问题解决方案的代码:

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 with Java x86 jdk8u40

最佳答案

您可以尝试使用“空图像”(例如,具有所需尺寸的 100% 透明图像 - 使用 Alpha channel 很容易做到)而不是空值。这应该替换内存中保存的图像,从而使其成为垃圾回收器。

关于JavaFX ImageView - 图像清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36390601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com