Hướng dẫn và ví dụ JavaFX ProgressBar và ProgressIndicator
Xem thêm các chuyên mục:

Là một website được viết trên công nghệ web Flutter vì vậy hỗ trợ rất tốt cho người học, kể cả những người học khó tính nhất.
Hiện tại website đang tiếp tục được cập nhập nội dung cho phong phú và đầy đủ hơn. Mong các bạn nghé thăm và ủng hộ website mới của chúng tôi.


ProgressBar và ProgressIndicator là các thành phần giao diện mô tả trực quan tiến độ của một công việc trong ứng dụng JavaFX

ProgressBar và ProgressIndicator với khối lượng công việc được xác định:

Ví dụ dưới đây tạo ra một ProgressBar và một ProgressIndicator mô phỏng một tiến trình không xác định được thời điểm kết thúc.

ProgressDemo.java
package org.o7planning.javafx.progress;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class ProgressDemo extends Application {
@Override
public void start(Stage stage) {
ProgressBar progressBar = new ProgressBar();
ProgressIndicator progressIndicator = new ProgressIndicator();
FlowPane root = new FlowPane();
root.setPadding(new Insets(10));
root.setHgap(10);
root.getChildren().addAll(progressBar, progressIndicator);
Scene scene = new Scene(root, 400, 300);
stage.setTitle("JavaFX ProgressBar & ProgressIndicator (o7planning.org)");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Bạn có thể tạo ra một nhiệm vụ (Task) để thực hiện một nhiệm vụ nào đó, chẳng hạn copy danh sách các file. Việc copy đòi hỏi mất một thời gian, bạn cần sử dụng ProgressBar hoặc ProgressIndicator để hiển thị phần trăm công việc đã làm được.

ProgressAndTaskDemo.java
package org.o7planning.javafx.progress;
import java.io.File;
import java.util.List;
import javafx.application.Application;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class ProgressAndTaskDemo extends Application {
private CopyTask copyTask;
@Override
public void start(Stage primaryStage) {
final Label label = new Label("Copy files:");
final ProgressBar progressBar = new ProgressBar(0);
final ProgressIndicator progressIndicator = new ProgressIndicator(0);
final Button startButton = new Button("Start");
final Button cancelButton = new Button("Cancel");
final Label statusLabel = new Label();
statusLabel.setMinWidth(250);
statusLabel.setTextFill(Color.BLUE);
// Start Button.
startButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
startButton.setDisable(true);
progressBar.setProgress(0);
progressIndicator.setProgress(0);
cancelButton.setDisable(false);
// Tạo một nhiệm vụ.
copyTask = new CopyTask();
// Hủy bỏ kết nối thuộc tính progress
progressBar.progressProperty().unbind();
// Kết nối thuộc tính progress.
progressBar.progressProperty().bind(copyTask.progressProperty());
// Hủy bỏ kết nối thuộc tính progress
progressIndicator.progressProperty().unbind();
// Kết nối thuộc tính progress.
progressIndicator.progressProperty().bind(copyTask.progressProperty());
// Hủy bỏ các kết nối thuộc tính text của Label.
statusLabel.textProperty().unbind();
// Kết nối thuộc tính text của Label
// với thuộc tính message của Task
statusLabel.textProperty().bind(copyTask.messageProperty());
// Khi nhiệm vụ hoàn thành
copyTask.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, //
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
List<File> copied = copyTask.getValue();
statusLabel.textProperty().unbind();
statusLabel.setText("Copied: " + copied.size());
}
});
// Start the Task.
// Thực thi nhiệm vụ
new Thread(copyTask).start();
}
});
// Cancel
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
startButton.setDisable(false);
cancelButton.setDisable(true);
copyTask.cancel(true);
progressBar.progressProperty().unbind();
progressIndicator.progressProperty().unbind();
statusLabel.textProperty().unbind();
//
progressBar.setProgress(0);
progressIndicator.setProgress(0);
}
});
FlowPane root = new FlowPane();
root.setPadding(new Insets(10));
root.setHgap(10);
root.getChildren().addAll(label, progressBar, progressIndicator, //
statusLabel, startButton, cancelButton);
Scene scene = new Scene(root, 500, 120, Color.WHITE);
primaryStage.setTitle("ProgressBar & ProgressIndicator");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
CopyTask.java
package org.o7planning.javafx.progress;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javafx.concurrent.Task;
// Copy all file in C:/Windows
public class CopyTask extends Task<List<File>> {
@Override
protected List<File> call() throws Exception {
File dir = new File("C:/Windows");
File[] files = dir.listFiles();
int count = files.length;
List<File> copied = new ArrayList<File>();
int i = 0;
for (File file : files) {
if (file.isFile()) {
this.copy(file);
copied.add(file);
}
i++;
this.updateProgress(i, count);
}
return copied;
}
private void copy(File file) throws Exception {
this.updateMessage("Copying: " + file.getAbsolutePath());
Thread.sleep(500);
}
}