我正在开发一个用于将图像文件上传到aws s3存储桶的javafx项目。在上传图像之前,我会检查图像的有效性,如图像的高度,重量和大小。由于上传过程非常耗时,我创建了一个监视器来监视(屏幕)上传进度。
class Monitor extends Stage {
private TextArea textArea = new TextArea();
Monitor(){
this.setTitle("Image Uploading Monitor");
this.getIcons().add(new Image("/rok.png"));
this.setFullScreen(false);
this.setResizable(false);
this.textArea.setEditable(false);
this.textArea.setPrefSize(700, 450);
Pane pane = new Pane();
pane.getChildren().add(this.textArea);
Scene scene = new Scene(pane, 700, 450);
this.setScene(scene);
}
void print(String string) {
this.textArea.appendText(string);
this.textArea.selectPositionCaret(textArea.getLength());
}
}
然后在每次上传图像后,我想在显示器中打印一条消息
for (File image : images) {
uploadFileToS3Bucket(image, "uploadingLocation");
monitor.print("Uploading image"+image.getName()+"\n");
}
代码工作正常,但问题是,显示器在所有图片上传后显示输出。
因为我在一个线程中运行了洞项目。如何使用多线程来解决问题?
答案 0 :(得分:1)
放置代码以在后台线程中上传图像,并在FX应用程序线程上安排对monitor.print(..)
的调用:
new Thread(() -> {
for (File image : images) {
uploadFileToS3Bucket(image, "uploadingLocation");
Platform.runLater(() -> monitor.print("Uploading image"+image.getName()+"\n"));
}
}).start();
这假定您的uploadFileToS3Bucket()
方法不执行任何UI工作。