进度条(ProgressBar)可视化JavaFX应用程序中的操作进度。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ProgressBar;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. @Override
  8. public void start(Stage stage) {
  9. Group root = new Group();
  10. Scene scene = new Scene(root, 260, 80);
  11. stage.setScene(scene);
  12. Group g = new Group();
  13. ProgressBar p2 = new ProgressBar();
  14. g.getChildren().add(p2);
  15. scene.setRoot(g);
  16. stage.show();
  17. }
  18. public static void main(String[] args) {
  19. launch(args);
  20. }
  21. }

Video_2022-04-28_161022.wmv (47.33KB)

创建ProgressBar

以下代码显示如何通过传递progress值来创建ProgressBar。

  1. ProgressBar pb = new ProgressBar(0.6);

image.png
还可以使用空构造函数创建没有参数的进度条。然后使用setProgress()方法分配值。如果我们不能确定任务的完全完成时间,可以设置进度条在不确定模式,直到确定任务的长度。
以下代码显示如何创建一个完成25%的进度条(ProgressBar)。

  1. import javafx.application.Application;
  2. import javafx.beans.value.ChangeListener;
  3. import javafx.beans.value.ObservableValue;
  4. import javafx.concurrent.Task;
  5. import javafx.event.ActionEvent;
  6. import javafx.event.EventHandler;
  7. import javafx.geometry.Pos;
  8. import javafx.scene.Group;
  9. import javafx.scene.Scene;
  10. import javafx.scene.control.Button;
  11. import javafx.scene.control.Label;
  12. import javafx.scene.control.ProgressBar;
  13. import javafx.scene.layout.BorderPane;
  14. import javafx.scene.layout.HBox;
  15. import javafx.scene.paint.Color;
  16. import javafx.stage.Stage;
  17. public class Main extends Application {
  18. Task copyWorker;
  19. public static void main(String[] args) {
  20. Application.launch(args);
  21. }
  22. @Override
  23. public void start(Stage primaryStage) {
  24. Group root = new Group();
  25. Scene scene = new Scene(root, 330, 120, Color.WHITE);
  26. BorderPane mainPane = new BorderPane();
  27. root.getChildren().add(mainPane);
  28. final Label label = new Label("Files Transfer:");
  29. final ProgressBar progressBar = new ProgressBar(0);
  30. final HBox hb = new HBox();
  31. hb.setSpacing(5);
  32. hb.setAlignment(Pos.CENTER);
  33. hb.getChildren().addAll(label, progressBar);
  34. mainPane.setTop(hb);
  35. final Button startButton = new Button("Start");
  36. final Button cancelButton = new Button("Cancel");
  37. final HBox hb2 = new HBox();
  38. hb2.setSpacing(5);
  39. hb2.setAlignment(Pos.CENTER);
  40. hb2.getChildren().addAll(startButton, cancelButton);
  41. mainPane.setBottom(hb2);
  42. startButton.setOnAction(new EventHandler<ActionEvent>() {
  43. public void handle(ActionEvent event) {
  44. startButton.setDisable(true);
  45. progressBar.setProgress(0);
  46. cancelButton.setDisable(false);
  47. copyWorker = createWorker();
  48. progressBar.progressProperty().unbind();
  49. progressBar.progressProperty().bind(copyWorker.progressProperty());
  50. copyWorker.messageProperty().addListener(new ChangeListener<String>() {
  51. public void changed(ObservableValue<? extends String> observable, String oldValue,
  52. String newValue) {
  53. System.out.println(newValue);
  54. }
  55. });
  56. new Thread(copyWorker).start();
  57. }
  58. });
  59. cancelButton.setOnAction(new EventHandler<ActionEvent>() {
  60. public void handle(ActionEvent event) {
  61. startButton.setDisable(false);
  62. cancelButton.setDisable(true);
  63. copyWorker.cancel(true);
  64. progressBar.progressProperty().unbind();
  65. progressBar.setProgress(0);
  66. System.out.println("cancelled.");
  67. }
  68. });
  69. primaryStage.setScene(scene);
  70. primaryStage.show();
  71. }
  72. public Task createWorker() {
  73. return new Task() {
  74. @Override
  75. protected Object call() throws Exception {
  76. for (int i = 0; i < 10; i++) {
  77. Thread.sleep(2000);
  78. updateMessage("2000 milliseconds");
  79. updateProgress(i + 1, 10);
  80. }
  81. return true;
  82. }
  83. };
  84. }
  85. }

Video_2022-04-28_161022.wmv (208.57KB)