JavaFX Multithreading and Progressbar

Tags: , , , ,



I have a problem with freeze GUI. I’m a beginner with JavaFX and don’t know what I’m doing wrong. VideoToImages is background method from which I’m getting IntegerProperties to set progressBar value.

This is my code:

public class FXMLDocumentController implements Initializable {

Service thread;
private IntegerProperty proc;
private IntegerProperty prom;
@FXML
private Label output;
@FXML
private Label source;
@FXML
private CheckBox color;
@FXML
private ProgressBar statusbar;
   
@FXML
public void check()
{
    ...
    
    Stage st=new Stage();
    Task ta =new Task() {
        @Override
        protected Object call() throws Exception {
               VideoToImages.start(st,proc,prom,color.isSelected(),source.getText(),output.getText());
               updateProgress(proc.longValue(), prom.longValue());
            return null;
        }
    };
    
     Thread te=new Thread(ta);
     statusbar.progressProperty().bind(ta.progressProperty());
     te.run();
}

}
@Override
public void initialize(URL url, ResourceBundle rb) {
   
    proc=new SimpleIntegerProperty();
    prom=new SimpleIntegerProperty();

}    
}

VideoToImages.start is getting frames from video and changes them to ascii images, saves this frames as images and put them to video. This is part where images are processing, prom is set and proc updatting.

public static void start(Stage primaryStage, IntegerProperty proc,IntegerProperty prom, boolean kolor, String source, String output)  { 

  mp.setOnEndOfMedia(()->{
    primaryStage.hide();
   ImagesToVideo vidSaver=new ImagesToVideo(saveDir, licz, klatka);
    
    int max=fd.listFiles().length;
    proc.setValue(0);
    prom.setValue(max);
    int pro=0;
    for(File fi: fd.listFiles())
    {         
      try {
          pro++;
          BufferedImage tempImg=ImageIO.read(fi);
          tempImg=ImageToAscii.CharToIMG3(tempImg, kolor);                                                   
          ImageIO.write(tempImg, "jpg", fi);
          
          proc.setValue(pro);
          
      } catch (IOException ex) {
          Logger.getLogger(VideoToImages.class.getName()).log(Level.SEVERE, null, ex);
      }
    }  

...

  });       

}

Answer

I finally got this. I sliced processing function to few smaller and separated from gui. Now i get progress from task property. Anyway thanks for help. This is test code:

   //Main function
        VideoToImages vti=new VideoToImages();
        Task ta=vti.getT();
         Thread te=new Thread(ta);
         statusbar.progressProperty().bind(ta.progressProperty());
         te.start();

    //Task class
   public class VideoToImages {
        public static Task t;

        public VideoToImages() {
       t=new Task() {
                @Override
                protected Object call() throws Exception {
                  // prom.setValue(100);
                      for(int i=0; i<100; i++)
                        {
                           // proc.setValue(i);
                            updateProgress(i, 100);
                            Thread.sleep(100);
                        }
                    return null;
                }
            };
        }

        public Task getT() {
            return t;
        }


    }


Source: stackoverflow