如何动态更改ImageView?

时间:2018-02-01 06:13:49

标签: java image javafx dynamic imageview

语言特点

爪哇

应用

我正在尝试创建一个基本图像搜索器,我在其中输入UPC并在ImageView上显示产品图像。

问题

如何在不创建新实例的情况下使用新图像动态更新ImageView,就像我在当前实现中所做的那样。

当前实施:

在我当前的实现中,我让事件处理程序创建一个新图像并将其设置为ImageView。

        searchButton.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent e)
        {
            input = searchBar.getText();
            image = new Image("url link" + input);
            imageView.setImage(image);
            searchBar.clear();
        }
    });

1 个答案:

答案 0 :(得分:1)

简短的回答是,这是不可避免的。这种实现完全正常。当您创建新的Image并将其设置为ImageView时,旧Image会丢失该引用,并且有资格进行垃圾回收。

答案很长,你可以在一定程度上控制这种行为。您可以在SoftReference的帮助下保留这些图像的缓存。

Map<String, SoftReference<Image>> imageCache = new HashMap<>();

.....

searchButton.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent e)
    {
        input = searchBar.getText();
        final String urlString = "url link" + input; // Or whatever the URL

        final SoftReference<Image> softRef = imageCache.get(urlString);
        Image image = null;

        if (softRef == null || softRef.get() == null) {
            image = new Image(urlString);
            imageCache.put(urlString, new SoftReference<>(image));
        }
        else
            image = softRef.get();

        imageView.setImage(image);
        searchBar.clear();
    }
});

这将允许您的控制器存储图像缓存,直到Java堆空间不足。