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;
}
}
冻结 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;
}
}