JavaFX 多线程和进度条

JavaFX Multithreading and Progressbar

冻结 GUI 有问题。我是 JavaFX 的初学者,不知道自己做错了什么。 VideoToImages 是后台方法,我从中获取 IntegerProperties 以设置 progressBar 值。

这是我的代码:

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 正在从视频中获取帧并将它们更改为 ascii 图像,将这些帧保存为图像并将它们放入视频中。这是处理图像、设置舞会和更新过程的部分。

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

...

  });       

}

我终于明白了。我将处理功能切成几个更小的部分并与 gui 分开。现在我从任务 属性 获得了进展。无论如何感谢您的帮助。这是测试代码:

   //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;
        }


    }