簡體   English   中英

在Javafx中下載圖像時的進度欄

[英]Progress Bar while downloading image in javafx

您好Stackoverflowers,我會簡短,所以我的問題是:在下載圖像時,如何在應用程序中顯示進度欄? 我做了一些研究,發現了一些有關“預加載器”和“屏幕截圖”的信息,但是我們只能在啟動主應用程序之前使用它們,關於進度條,我知道我必須將其綁定,但是如何我將其與我的圖像綁定嗎? 我感謝任何幫助。

這是我創建一個簡單幻燈片的代碼:

@PostConstruct
public void init()
{

    All_photos photos = (All_photos) new parse_object <All_photos> (All_photos.class).ParseUri("https://api.edmunds.com/api/media/v2/styles/"+id+"/photos?api_key=wdxg7wh338vac3359m34qjj6&fmt=json");

    Images = new ArrayList<Image>();

    ArrayList<String> list_href = new SlideShowHelper().get_href(photos);

    for ( String st:list_href)
    {
        System.out.println(st);
        Images.add(new Image("https://media.ed.edmunds-media.com"+st+""));
    }
    }

要知道,下載圖像需要一段時間,這取決於互聯網的連接速度。

該答案回答了您的問題標題:“在javafx中下載圖像時的進度條”。

您問題中的代碼不清楚,因此答案可能會也可能不會回答您真正希望實現的目標。

熊

  1. 將圖像加載到背景中
  2. 將ProgressBar的progress屬性綁定到圖像的progessProperty

注意:對於示例代碼和圖像,圖像加載非常快,因此您實際上看不到進度條在移動。 對於正在加載的非常大的圖像和非常慢的Internet連接,您可能會看到進度欄隨着加載的進行而移動。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ImageLoadProgress extends Application {

    private static final String IMAGE_LOC =
            "http://icons.iconarchive.com/icons/custom-icon-design/flatastic-10/128/Bear-icon.png";

    @Override
    public void start(Stage stage) throws Exception {
        Image image = new Image(IMAGE_LOC, true);
        ProgressBar bar = new ProgressBar();
        bar.progressProperty().bind(image.progressProperty());

        ImageView imageView = new ImageView(image);
        imageView.setFitWidth(128);
        imageView.setFitHeight(128);
        stage.setScene(new Scene(new VBox(5, bar, imageView)));
        stage.show();
    }

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

更新其他問題

如何創建要下載多個圖像和一個進度條的任務?

使用DoubleExpression,它映射到所有圖像的背景加載進度的平均值。

多張圖片

import javafx.application.Application;
import javafx.beans.binding.DoubleExpression;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Arrays;
import java.util.stream.Collectors;

public class ImagesLoadProgress extends Application {

    private static final String IMAGE_PATH_PREFIX =
            "http://icons.iconarchive.com/icons/custom-icon-design/flatastic-10/128/";

    private static final String[] IMAGES_FILENAMES = {
            "Bear-icon.png",
            "Bow-icon.png",
            "Sport-american-football-icon.png",
            "Sport-baseball-icon.png"
    };

    @Override
    public void start(Stage stage) throws Exception {
        Image[] images =
                Arrays.stream(IMAGES_FILENAMES)
                .map(filename -> new Image(IMAGE_PATH_PREFIX + filename, true))
                .toArray(Image[]::new);

        DoubleExpression totalImageDownloadProgress;
        if (images.length > 0) {
            totalImageDownloadProgress = new SimpleDoubleProperty(0);
            for (Image image: images) {
                totalImageDownloadProgress = totalImageDownloadProgress.add(image.progressProperty());
            }
            totalImageDownloadProgress = totalImageDownloadProgress.divide(IMAGES_FILENAMES.length);
        } else {
            totalImageDownloadProgress = new SimpleDoubleProperty(1);
        }


        ProgressBar bar = new ProgressBar();
        bar.progressProperty().bind(totalImageDownloadProgress);

        VBox layout = new VBox(5, bar);

        Arrays.stream(images)
                .map(this::createImageView)
                .collect(Collectors.toCollection(layout::getChildren));

        stage.setScene(new Scene(layout));
        stage.show();
    }

    private ImageView createImageView(Image image) {
        ImageView imageView = new ImageView(image);
        imageView.setFitWidth(128);
        imageView.setFitHeight(128);

        return imageView;
    }

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

上面的解決方案並未考慮無法加載圖像的錯誤情況 ,但我將繼續為您添加此類邏輯(本質上是監視error屬性並調整加載進度的平均計算,以不包括無法加載圖像的錯誤)加載)。

謝謝你們的幫助,我找到了答案:

 final Task<ArrayList<Image>> task = new Task<ArrayList<Image>>() {
            @Override protected ArrayList<Image> call() throws Exception {

                int id = Data_model.getInstance().currentid();

                All_photos photos = (All_photos) new parse_object <All_photos> (All_photos.class).ParseUri("https://api.edmunds.com/api/media/v2/styles/"+id+"/photos?api_key=id&fmt=json");

                ArrayList<String> list_href = new SlideShowHelper().get_href(photos);

                ArrayList<Image> list = new ArrayList<Image>();

                int i = 1;

                            for ( String st:list_href)
                            {

                                System.out.println(st);
                                list.add(new Image("https://media.ed.edmunds-media.com"+st+"",true));
                                updateProgress(i, list_href.size());
                                Thread.sleep(400);
                                i++;


                            }
                            return list;
            }


             @Override protected void succeeded() {

                 super.succeeded();

                 updateProgress(10, 10);

                 img_slideshow.setImage(Images.get(0));

                 int count1 =count+1;

                 lbl_slideshow.setText(""+count1+" / "+Images.size()+"");

                 progress_sd.setVisible(false);  

                 btn_sd_back.setVisible(true);
                 btn_sd_next.setVisible(true);


             }


         };

        task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED,new EventHandler<WorkerStateEvent>() {

            public void handle(WorkerStateEvent t) {
                Images = task.getValue();

            }
        });

    new Thread(task).start();


    //progress_sd.visibleProperty().bind(task.runningProperty());

    progress_sd.progressProperty().bind(task.progressProperty());

}

它正在工作,但是? 好嗎 ?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM