java - 如何延迟加载图片而不是等待它在Java中完成下载?

Posted

技术标签:

【中文标题】java - 如何延迟加载图片而不是等待它在Java中完成下载?【英文标题】:How to lazy load a picture instead of waiting for it to be finished downloading in Java? 【发布时间】:2016-11-29 11:08:10 【问题描述】:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Testwebimage extends Application 

    public void start(Stage primaryStage) 

        Image image = new Image("http://i.imgur.com/hbjCOgg.jpg");
        ImageView imageView = new ImageView();
        imageView.setImage(image);

        StackPane root = new StackPane();
        root.getChildren().add(imageView);
        Scene scene = new Scene(root);

        primaryStage.setScene(scene);
        primaryStage.setMaximized(true);
        primaryStage.show();
    
    public static void main(String[] args) 
        launch(args);
    

我正在尝试创建一个直接从 url 显示图像的程序,但我遇到的问题是它等待图像完全加载然后显示它,这意味着如果图像大小很大,显示图像会花费大量时间,这会很烦人。但如果它会显示图像加载打开,有点像this。

有人知道如何实现this 之类的东西吗?

【问题讨论】:

maybe InputStream an image? 【参考方案1】:

这是一个异步加载图像的示例。您可以选择是要使用本地文件还是远程 URL。

package jfxfeatures.graphics.image.loading.async;

import java.io.File;
import java.net.MalformedURLException;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class AsyncImageDemo extends Application 

    @Override
    public void start(Stage stage) 
        String imgURL = null;
        try 
            final String remoteURL = "http://farm5.staticflickr.com/4129/4960490401_71a3d05d28_o_d.jpg";
            final String remoteURL2 = "http://www.spacetelescope.org/static/archives/posters/large/earth02.jpg";
            final String localURL = new File("data/earth02.jpg").toURI().toURL().toExternalForm();
            final String localFile = "/earth02.jpg";

            //===========================
            // Select local or remote image source.
            imgURL = localFile;
            //===========================
         catch (MalformedURLException e1) 
            e1.printStackTrace();
        

        StackPane root = new StackPane();
        Scene scene = new Scene(root, 800, 800);
        scene.setFill(Color.BLACK);

        ImageView iv = new ImageView();
        iv.setPreserveRatio(true);
        iv.fitHeightProperty().bind(root.heightProperty());
        iv.fitWidthProperty().bind(root.widthProperty());
        root.getChildren().add(iv);

        stage.setTitle(getClass().getSimpleName());
        stage.setScene(scene);
        stage.show();

        if (imgURL != null) 
            Image image = new Image(imgURL, true);
            image.progressProperty().addListener(new ChangeListener<Number>() 
                @Override
                public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) 
                    System.out.println("Progress: " + Math.rint(newValue.doubleValue() * 100) + "%");
                
            );
            iv.setImage(image);
        
    

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

【讨论】:

以上是关于java - 如何延迟加载图片而不是等待它在Java中完成下载?的主要内容,如果未能解决你的问题,请参考以下文章

js中,如何等待多个图片加载完后再执行其他的js代码。

图片预加载和懒加载

setTimeout 立即运行,而不是等待延迟值

UITableView - 延迟加载联系人图片

来自CDN的延迟加载

JAVA的单例模式与延时加载