2017-02-16 8 views
1

Hello Stackoverflowers, Я буду коротким, так что мой вопрос: Как я могу показать индикатор выполнения в моем приложении во время загрузки моего изображения? Я провел некоторое исследование, и я нашел кое-что о «preloader» и «splach-screen», но мы можем использовать эти последние только до начала моего основного приложения и о баре прогресса, я знаю, что мне нужно связать его, но как могу ли я связать его с моим изображением? Я ценю любую помощь.Progress Bar при загрузке изображения в javafx

это мой код создания простого слайда-шоу:

@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+"")); 
    } 
    } 

просто знать, что изображение займет некоторое время для загрузки, зависит от скорости подключения к Интернету.

+0

Это может быть полезно - http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm –

+0

Какой поток называется init() '?Можете ли вы объяснить части кода, который вы не указали, и что вы хотите сделать - например, это загрузка коллекции изображений, по-видимому, поэтому достаточно просто обновить индикатор выполнения, когда каждое изображение завершает загрузку? Вам действительно нужно загружать все изображения вперед так: почему бы вам просто не использовать встроенную загрузку фона в классе «Image»? –

+0

Извините, что не объяснял мой код, это просто: 1- сохранить все ссылки моих фотографий в объекте под названием All_photos, –

ответ

0

Спасибо вам, ребята, за вашу помощь, я нашел ответ:

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()); 

} 

это работает, но? это хорошо ?

1

Этот ответ отвечает на ваш вопрос: «Полоса хода при загрузке изображения в javafx».

Код в вашем вопросе немного неясен, поэтому ответ может ответить или не ответить на то, что вы действительно хотите достичь.

bear

  1. Загрузить изображение в background.
  2. Привяжите свойство ProgressBar к изображению progessProperty.

Примечание: для образца кода и изображений, изображение загружается очень быстро, так что вы на самом деле не видите индикатор движения. Для очень большое изображение загружается и очень медленное подключение к Интернету, вы можете видеть ход выполнения движения по мере прогрессирования загрузки.

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, которое соответствует средним значениям фоновой загрузки всех изображений.

multiple images

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 conditions for images that fail to load, но я оставлю добавлять такую ​​логику к вам (по существу контролировать свойство ошибки и корректировать средний расчет для прогресса загрузки не включать те изображения, которые не загружаются).

+0

Спасибо, Jewelsea, это простой пример, и я уже понял его и нашел, прежде чем задавать свой вопрос, как я могу создать задачу с несколькими загружаемыми изображениями и одним индикатором выполнения? –