【问题标题】:JavaFX Multithreading and ProgressbarJavaFX 多线程和进度条
【发布时间】:2020-10-29 03:23:57
【问题描述】:

我遇到了冻结 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);
      }
    }  

...

  });       

}

【问题讨论】:

  • 您是从 VideoToImages.start 函数更新 proc 和 prom 吗?如果是这样,您是否将其卸载到 fx 线程中?
  • proc 和 prom 正在 VideoToImages 中更新,在该方法中没有线程。当我重新获得控制权时,GUI 冻结和进度条即使在结束时也不会改变
  • VideoToImages.start 中发生了什么?发布MCVE。
  • 请阅读参考的帮助页面并采取相应措施

标签: java multithreading javafx progress-bar javafx-8


【解决方案1】:

我终于明白了。我将处理功能切成小块并与 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;
        }


    }

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多