【发布时间】: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