当前位置: 首页 > 知识库问答 >
问题:

JavaFX ImageView-图像清理

益源
2023-03-14

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

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

为了监控行为,我使用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 x64位,带有Java x86 jdk8u40

共有1个答案

赵立果
2023-03-14

您可以尝试使用“空图像”(例如,要求大小的100%透明图像-易于使用alpha通道)而不是空值。这将取代内存中的映像,从而使其成为垃圾回收。

 类似资料:
  • 问题内容: 我正在编写脚本以将图像上传到我的应用程序。以下安全步骤是否足以使应用程序从脚本角度安全? 使用.httaccess禁止PHP在上传文件夹中运行。 如果文件名包含字符串“ php”,则不允许上传。 仅允许扩展名:jpg,jpeg,gif和png。 仅允许图像文件类型。 禁止使用两种文件类型的图像。 更改图像名称。 上载到不是根目录的子目录。 这是我的脚本: 欢迎任何新提示:) 问题答案:

  • 我正在使用这个代码。。。 存储到位图的图像清晰度很差。只有4kb。如何提高图像的清晰度?

  • canvas 在绘制的时候,由于浏览器的缩放比例以及现在电脑的高清屏导致绘制的图像不清晰问题。 这篇文章可以分享一下,解决了上述的问题 高清的canvas图像

  • After you configure your offline mirror, Yarn will automatically add new package tarballs to the mirror. However, it does not automatically remove tarballs that are no longer referenced in yarn.lock.

  • 背景信息:我有一个gridlayout为(5,7)的JFrame,我试图向(0,0)的单元格网格添加一个图像 我遵循本指南向特定JPanel添加图像。 在 JPanel 单元格中显示图像: 列表项 将芯片图像放入图像图标中。 通过JLabel的setIcon(chipIcon)方法将该ImageIcon放入JLabel中。 通过Add(someLabel)方法将JLabel添加到JPanel中,J

  • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的