12.6.2 创建进度对话框

12.6.2 创建进度对话框

ProgressMonitor的用法与JProgressBar的用法基本相似,只是ProgressMonitor可以直接创建一个进度对话框。

构造器

ProgressMonitor提供了如下构造器。

方法 描述
ProgressMonitor(Component parentComponent, Object message, String note, int min, int max)
  • parentComponent参数用于设置该进度对话框的父组件,
  • message用于设置该进度对话框的描述信息,note用于设置该进度对话框的提示文本,
  • minmax用于设置该对话框所包含进度条的最小值和最大值。

代码 创建进度对话框

例如,如下代码创建了一个进度对话框。

1
final ProgressMonitor dialog = new ProgressMonitor(null,"等待任务完成","已完成:",0, target, getAmount());

使用上面代码创建的进度对话框如图12.30所示。
这里有一张图片

如何判断用户是否点击取消按钮

如图12.30所示,该对话框中包含了一个“取销”按钮,如果程序希望判断用户是否单击了该按钮,则可以通过ProgressMonitorisCanceled()方法进行判断
使用ProgressMonitor创建的对话框里包含的进度条是非常固定的,程序甚至不能设置该进度条是否包含边框(总是包含边框),不能设置进度不确定,不能改变进度条的方向(总是水平方向)。

进度对话框如何设置完成度

与普通进度条类似的是,进度对话框也不能自动监视目标任务的完成进度,程序通过调用进度对话框的setProgress方法来改变进度条的完成比例(该方法类似于JProgressBarsetValue方法)

方法 描述
void setProgress(int nv) Indicate the progress of the operation being monitored.

程序 进度对话框

下面程序同样采用前面的SimulatedTarget来模拟一个耗时的任务,并创建了一个进度对话框来监测该任务的完成百分比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import javax.swing.*;

public class ProgressMonitorTest {
Timer timer;

public void init() {
final SimulatedActivity target = new SimulatedActivity(1000);
// 以启动一条线程的方式来执行一个耗时的任务
final Thread targetThread = new Thread(target);
targetThread.start();
final ProgressMonitor dialog = new ProgressMonitor(null, "等待任务完成", "已完成:", 0, target.getAmount());
timer = new Timer(300, e -> {
// 以任务的当前完成量设置进度对话框的完成比例
dialog.setProgress(target.getCurrent());
// 如果用户单击了进度对话框的"取消"按钮
if (dialog.isCanceled()) {
// 停止计时器
timer.stop();
// 中断任务的执行线程
targetThread.interrupt(); // ①
// 系统退出
System.exit(0);
}
});
timer.start();
}

public static void main(String[] args) {
new ProgressMonitorTest().init();
}
}

上面程序中创建了一个进度对话框,并创建了一个Timer计时器不断询问SimulatedTarget任务的完成比例,进而设置进度对话框里进度条的完成比例。而且该计时器还负责监听用户是否单击了进度对话框中的“取销”按钮,如果用户单击了该按钮,则中止执行SimulatedTarget任务的线程,并停止计时器,同时退出该程序。运行该程序,会看到如图12.30所示的对话框
这里有一张图片