Hướng dẫn và ví dụ JavaFX ProgressBar và ProgressIndicator
1. ProgressBar và ProgressIndicator
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:
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);
}
}
Các hướng dẫn lập trình JavaFX
- Mở một cửa sổ (window) mới trong JavaFX
- Hướng dẫn và ví dụ JavaFX ChoiceDialog
- Hướng dẫn và ví dụ JavaFX Alert Dialog
- Hướng dẫn và ví dụ JavaFX TextInputDialog
- Cài đặt e(fx)clipse cho Eclipse (Bộ công cụ lập trình JavaFX)
- Cài đặt JavaFX Scene Builder cho Eclipse
- Hướng dẫn lập trình JavaFX cho người mới bắt đầu - Hello JavaFX
- Hướng dẫn và ví dụ JavaFX FlowPane Layout
- Hướng dẫn và ví dụ JavaFX TilePane Layout
- Hướng dẫn và ví dụ JavaFX HBox, VBox Layout
- Hướng dẫn và ví dụ JavaFX BorderPane Layout
- Hướng dẫn và ví dụ JavaFX AnchorPane Layout
- Hướng dẫn và ví dụ JavaFX TitledPane
- Hướng dẫn và ví dụ JavaFX Accordion
- Hướng dẫn và ví dụ JavaFX ListView
- Hướng dẫn và ví dụ JavaFX Group
- Hướng dẫn và ví dụ JavaFX ComboBox
- Hướng dẫn sử dụng các phép biến hình (Transformations) trong JavaFX
- Các hiệu ứng (effects) trong JavaFX
- Hướng dẫn và ví dụ JavaFX GridPane Layout
- Hướng dẫn và ví dụ JavaFX StackPane Layout
- Hướng dẫn và ví dụ JavaFX ScrollPane
- Hướng dẫn và ví dụ JavaFX WebView và WebEngine
- Hướng dẫn và ví dụ JavaFX HTMLEditor
- Hướng dẫn và ví dụ JavaFX TableView
- Hướng dẫn và ví dụ JavaFX TreeView
- Hướng dẫn và ví dụ JavaFX TreeTableView
- Hướng dẫn và ví dụ JavaFX Menu
- Hướng dẫn và ví dụ JavaFX ContextMenu
- Hướng dẫn và ví dụ JavaFX Image và ImageView
- Hướng dẫn và ví dụ JavaFX Label
- Hướng dẫn và ví dụ JavaFX Hyperlink
- Hướng dẫn và ví dụ JavaFX Button
- Hướng dẫn và ví dụ JavaFX ToggleButton
- Hướng dẫn và ví dụ JavaFX RadioButton
- Hướng dẫn và ví dụ JavaFX MenuButton và SplitMenuButton
- Hướng dẫn và ví dụ JavaFX TextField
- Hướng dẫn và ví dụ JavaFX PasswordField
- Hướng dẫn và ví dụ JavaFX TextArea
- Hướng dẫn và ví dụ JavaFX Slider
- Hướng dẫn và ví dụ JavaFX Spinner
- Hướng dẫn và ví dụ JavaFX ProgressBar và ProgressIndicator
- Hướng dẫn và ví dụ JavaFX ChoiceBox
- Hướng dẫn và ví dụ JavaFX Tooltip
- Hướng dẫn và ví dụ JavaFX DatePicker
- Hướng dẫn và ví dụ JavaFX ColorPicker
- Hướng dẫn và ví dụ JavaFX FileChooser và DirectoryChooser
- Hướng dẫn và ví dụ JavaFX PieChart
- Hướng dẫn và ví dụ JavaFX AreaChart và StackedAreaChart
- Hướng dẫn và ví dụ JavaFX BarChart và StackedBarChart
- Hướng dẫn và ví dụ JavaFX Line
- Hướng dẫn và ví dụ JavaFX Rectangle và Ellipse
Show More