随着科技的不断发展,人们对于信息的获取渐渐变得越来越快速,因此,对于一个优秀的应用程序来说,快速响应用户的操作是非常重要的,否则,这个应用程序很可能会被用户抛弃。因此,如何让应用程序在处理某项任务时能够更好地提示用户,增强用户体验,这就需要我们使用一些界面控件来实现。今天,我将向大家介绍如何使用ProgressIndicator实现更好的用户体验。
一、ProgressIndicator 简介
在理解如何使用ProgressIndicator之前,我们先来了解一下什么是ProgressIndicator。ProgressIndicator是JavaFX中的一个控件,用于表示活动正在进行(例如:应用程序正在加载、正在发送数据等)的状态。可以理解为进度条的一种变形,不同之处在于,进度条通常是做一个较长事件的可确定数量的进度,而ProgressIndicator则是适合动态的、不确定长度的任务。
二、如何使用ProgressIndicator
在这里我会分别介绍如何使用ProgressBar和ProgressIndicator两个控件,并对比它们之间的区别。
1. ProgressBar 的使用
在使用ProgressBar之前,我们需要先了解一下它的一些属性。
(1)progressbar.progress
该属性是一个DoubleProperty类型的属性。设置ProgressBar在进度条上的位置。进度条范围从0.0到1.0。
(2)progressbar.indeterminate
该属性是一个BooleanProperty类型的属性,默认为false。当其为true时,在进度条的位置将会显示一个动态动画。
(3)progressbar.prefWidth
该属性是一个DoubleProperty类型的属性,默认为150.0。设置ProgressBar的首选宽度。
(4)progressbar.prefHeight
该属性是一个DoubleProperty类型的属性,默认为20.0。设置ProgressBar的首选高度。
接下来我们看看如何使用ProgressBar。
```java
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Button startBtn = new Button("Start");
Button stopBtn = new Button("Stop");
ProgressBar progressBar = new ProgressBar(0);
progressBar.setPrefSize(500,20);
progressBar.setStyle("-fx-accent:Red;");
HBox hbox = new HBox();
hbox.setSpacing(10);
hbox.setAlignment(Pos.CENTER);
hbox.getChildren().addAll(startBtn,stopBtn);
VBox vbox = new VBox();
vbox.setSpacing(15);
vbox.setPadding(new Insets(20,20,20,20));
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().addAll(progressBar,hbox);
Scene scene = new Scene(vbox, 600, 400);
primaryStage.setScene(scene);
primaryStage.setTitle("ProgressBar Demo");
primaryStage.show();
startBtn.setOnAction(event -> {
progressBar.setProgress(0);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i=0;i<=100;i++){
Thread.sleep(100);
progressBar.setProgress(i/100.0);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
});
t.start();
});
stopBtn.setOnAction(event -> {
progressBar.setProgress(0);
});
}
public static void main(String[] args) {
launch(args);
}
}
```
上面的代码演示了如何创建一个ProgressBar,和一些基本的属性的使用方法。这里定义了一个进度条和两个按钮(开始、结束),当点击开始时,进度条会执行从0到100的过程。ProgressBar的颜色可以使用.setStyle()方法进行设置,比如这里我设置了进度条为红色。
然而,在处理不确定数量长度的任务时,使用ProgressBar可能并不适合。因为在这种情况下,我们通常需要在对话框上显示一些不确定长度任务的描述,并且有时我们甚至不知道任务何时会结束。ProgressBar适合处理一些相对固定的任务,例如文件的上传和下载等。
2. ProgressIndicator 的使用
接下来,相比ProgressBar的使用,我们再来探讨一下ProgressIndicator的用法。首先需要注意的是,ProgressIndicator和ProgressBar的属性相比要更简洁。
下面的代码演示如何使用ProgressIndicator控件:
```java
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Button startBtn = new Button("Start");
Button stopBtn = new Button("Stop");
ProgressIndicator progressIndicator = new ProgressIndicator();
progressIndicator.setPrefSize(80,80);
HBox hbox = new HBox();
hbox.setSpacing(10);
hbox.setAlignment(Pos.CENTER);
hbox.getChildren().addAll(startBtn,stopBtn);
VBox vbox = new VBox();
vbox.setSpacing(15);
vbox.setPadding(new Insets(20,20,20,20));
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().addAll(progressIndicator,hbox);
Scene scene = new Scene(vbox, 600, 400);
primaryStage.setScene(scene);
primaryStage.setTitle("ProgressIndicator Demo");
primaryStage.show();
startBtn.setOnAction(event -> {
progressIndicator.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
});
stopBtn.setOnAction(event -> {
progressIndicator.setProgress(0);
});
}
public static void main(String[] args) {
launch(args);
}
}
```
可以看到,ProgressIndicator的属性非常简洁,只有一个indeterminate属性。当该属性为true时,一个无限循环的动画会被创建并且循环展示。这种方式是适合处理不确定长度任务的。
三、ProgressIndicator 使用技巧
使用ProgressBar和ProgressIndicator都有一些技巧,下面我将列出一些比较重要的技巧。
1. 设置进度条颜色
进度条颜色可以使用.setStyle()方法进行设置。对于ProgressBar来说,可以通过这种方式对进度条的颜色进行调整,可以让用户的眼睛更容易地关注到进度条。
```java
progressbar.setStyle("-fx-accent:Red;");
```
2. 设置进度条长度
ProgressBar和ProgressIndicator的长度是不一样的,ProgressBar需要指定其宽度,而ProgressIndicator只需要指定其大小,不需要指定宽和高,它会自动地调整到合适的尺寸。
```java
progressbar.setPrefSize(500,20);
```
3. 创建后台线程
如果我们需要执行耗时的任务,那么我们需要将这些任务放入到单独的线程中,以避免阻塞UI线程。
在下面的示例中,我使用了一个后台线程来模拟任务的长时间执行。在回调函数中,我使用Platform.runLater()来更新UI线程上的ProgressBar或ProgressIndicator的进度。
```java
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i=0;i<=100;i++){
Thread.sleep(100);
Platform.runLater(new Runnable(){
@Override
public void run() {
progressbar.setProgress(i/100.0);
}
});
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
});
t.start();
```
4. 显示任务描述
当我们需要执行一些不确定长度的任务时,在提示用户任务正在进行的同时,我们也应该在UI界面上给出任务描述,告诉用户正在执行什么操作,例如:
```java
Label label = new Label("正在加载,请稍后...");
progressbar = new ProgressBar();
VBox vBox = new VBox(20);
vBox.setAlignment(Pos.CENTER);
vBox.getChildren().addAll(label,progressbar);
```
5. 使用 ProgressIndicator 细节
ProgressIndicator 与 ProgressBar使用时有一些细节需要注意。例如,ProgressIndicator在使用时不能直接设置进度,因为它没有.progress属性,应该调用.setProgress()方法来设置它的进度,使用时不能直接设置进度,应该调用setter方法设置。
```java
progressIndicator.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
```
另外,要明白 ProgressIndicator 的工作原理,即它一直在转圈(即 ‘indeterminate progress’)。而 ProgressBar只在指定的范围内执行动画效果,在结束以后就停止了。
四、总结
在JavaFX中,ProgressIndicator和ProgressBar两个控件对于我们来说都是非常有用的。无论是处理确定长度还是不确定长度任务,都可以使用这些控件来为用户提供更好的体验。在使用这些控件时,我们应该着重关注一些使用技巧,例如:设置进度条颜色,创建后台线程等等。在实际中灵活应用这些技巧,可以使我们的界面更加美观,也能增强用户体验。