最近在做一个视频压缩的桌面软件,因为有些视频比较大,压缩起来比较费时,所以软件里面要有进度条动态展示视频压缩的进度,以及提示信息。现在把我做视频压缩软件过程中的经验分享给大家,希望对你们有帮助。javaFX ProgressBar进度条是如何实现的?并要有实时进度展示,废话不多说,直接上代码
Label label = new Label("进度条demo");
label.setFont(Font.font(16));
ProgressBar progressBar = new ProgressBar(0);
progressBar.setPrefWidth(500);
progressBar.setPrefHeight(12);
progressBar.setStyle("-fx-accent: #337ecc");
Label progressBarLabel = new Label("");
progressBarLabel.setFont(Font.font(14));
progressBarLabel.setPadding(new Insets(0, 0, 5, 70));
HBox hBox = new HBox(progressBarLabel);
HBox.setMargin(progressBarLabel, new Insets(180, 0, 0, 0));
HBox hBox1 = new HBox(progressBar);
hBox1.setAlignment(Pos.CENTER);
Button confirm = new Button("开始");
confirm.setPrefWidth(100);
confirm.setPrefHeight(30);
// 开始按钮绑定事件
confirm.setOnAction(actionEvent -> {
// 开始计算进度条进度
Task worker = createWorker();
// 监听任务里的展示信息,然后动态展示内容
worker.messageProperty().addListener((observable, oldValue, newValue) -> {
String message = worker.getMessage();
progressBarLabel.setText(message);
});
progressBar.progressProperty().unbind();
// 进度条绑定计算任务
progressBar.progressProperty().bind(worker.progressProperty());
Thread thread = new Thread(worker);
// 开始计算
thread.start();
});
HBox hBox2 = new HBox(confirm);
hBox2.setAlignment(Pos.CENTER);
HBox.setMargin(confirm, new Insets(30, 0, 0, 0));
// 垂直布局
VBox vBox = new VBox(label, hBox, hBox1, hBox2);
vBox.setAlignment(Pos.TOP_CENTER);
var scene = new Scene(vBox, 640, 480);
stage.setScene(scene);
stage.show();
/**
* 计算进度条任务
*
* */
private Task createWorker() {
return new Task() {
@Override
protected Object call() {
for (int i = 1; i <= 100; i++) {
// 这里为更新进度条计算,第一个参数/第二个参数为当前进度,这里简单计算为从1到100,可以根据实际场景在循环里面计算进度
updateProgress(i, 100);
// 更新进度条展示信息,可以根据实际场景展示需要的信息
updateMessage(i + "%");
try {
Thread.sleep(100); // sleep 100ms,方便展示进度条效果
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return true;
}
};
}
先看看demo的效果,点击开始按钮开始计算进度,并显示当前进度百分比
再看看我制作的视频压缩软件的实际效果
总结
ProgressBar 要绑定一个Task类的任务对象,进度条计算逻辑在Task类里面实现,
updateProgress方法是更新进度条进度的,而updateMessage方法是更新进度条展示信息的,worker.messageProperty().addListener可以监听updateMessage方法的值,
在监听方法里面修改展示信息即可,然后新建一个Thread线程,传入Task类对象,最后开启线程。
由于我是做了很多年的java开发,所以最后选择了javaFX来做桌面软件,既可以跨平台,又可以降低学习成本,在我的javaFX专栏里面还有很多关于javaFX开发桌面软件的文章,你可以学到很多关于javaFX 桌面软件开发的知识,后续还会继续更新以及开设更多的专栏,敬请期待!
我的javaFX专栏
如果你有什么意见或建议,请在评论区发表评论!