openplanning

Hướng dẫn và ví dụ JavaFX ProgressBar và ProgressIndicator

Xem thêm các chuyên mục:

Nhóm phát triển của chúng tôi vừa ra mắt website langlearning.net học tiếng Anh, Nga, Đức, Pháp, Việt, Trung, Hàn, Nhật, ... miễn phí cho tất cả mọi người.
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.
Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- ProgressBar và ProgressIndicator

ProgressBarProgressIndicator 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
ProgressBarProgressIndicator với khối lượng công việc được xác định:

2- Ví dụ với ProgressBar & ProgressIndicator

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);
    }

}

3- Progress và Task (nhiệm vụ)

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);
    }

}

 

Xem thêm các chuyên mục: