`
feipigzi
  • 浏览: 111385 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(二)如何使用Progress Bar

阅读更多
英文文档:http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

如何使用Progress Bars

(1)使用确定模式进度条

(2)使用不确定模式进度条

(3)使用进度监视器

(4)决定使用进度条还是进度监视器

(5)ProgressMonitorInputStream输入流进度监视器的使用

 

    有时候程序中的任务需要一段时间才能完成。一个好的程序应该向用户提供了一些指示信息:任务正在运行、任务需要多长时间、任务已经完成多少。这种指示工作可以使用进度的估算来描述(进度条),本质上是一种动态地图片。

    另一种方法是使用等待光标(wait cursor),使用Cursor类和setCursor方法。例如,下面代码使得wait cursor显示在container上(这个container可以使任何未指定cursor的组件)

 

container.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR))

    你可以像下面这样使用进度条,告知用户任务已经完成了多少



     有时候,你不能立刻确定一个大任务所需的时间,或者仍无会阻塞在某一个状态很长时间。你可以不通过度量进度,而是把progress bar放入不确定模式(indeterminate mode)。不确定模式的进度条会动态指示任务正在完成。随着进度条可以显示更多有意义的信息,你应该把他转变为默认的确定模式。在Java样式中,不确定模式的进度条是这样的:


(深色块滚动)

 

Swing提供了三个类帮助你使用progress bars:

 

 JProgressBar

    一个可视化的组件,图形化显示已经完成总任务的多少。参考“(1)使用确定模式进度条 使用典型的进度条。参考“(2)使用不确定模式进度条”在任务大小确定前滚动进度条

ProgressMonitor

    一个非可视化组件。该类的实例检测任务进度,并且在必要的时候弹出对话框,参考“(3)使用进度监视器”

ProgressMonitorInputStream

    一个关联进度监视器的输入流,监视器从该输入流中读取数据。你可以像其他基本I/O输入流一样使用它。你可以想”(3)使用进度监视器“中描述那样,通过调用getProgressMonitor和配置它获得该流的进度监视器。

 

    接着介绍“(4)决定使用进度条还是进度监视器”

(1)使用确定模式进度条

    使用进度条度量本线程任务进度:




 
     下面是代码来自ProgressBarDemo.java 创建和设置进度条:

//Where member variables are declared:
JProgressBar progressBar;
...
//Where the GUI is constructed:
progressBar = new JProgressBar(0, task.getLengthOfTask());
progressBar.setValue(0);
progressBar.setStringPainted(true);

 

    这个构造器创建了进度条,设置了进度条的最大最小值。你同样可以通过setMinimum和setMaximun来设置这些值。这个例子程序中的进度条最大值和最小是分别是0和任务的长度。不过,进度条的最大最小是可以使任意值,包括附属。这段代码也设置了进度条的当前值为0.

    setStringPainted的调用使得进度条展现为边界、已完成任务百分比文字描述。默认情况下,进度条显示getPercentComplete方法返回的值。可以选择的是,你可以通过调用setString改变默认的字符串(默认:1%,2%……)。例如:

 

if (/*...half way done...*/)
    progressBar.setString("Half way there!");

 

当用户点击开始,一个内部类任务实例就被创建并运行:

 

public void actionPerformed(ActionEvent evt) {
    startButton.setEnabled(false);
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    done = false;
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();
}

      Task是javax.swing.SwingWorker 的子类。对于这个demo来讲Task实例实现了三件重要的事情:

    1.实例在分离线程中调用doInBackground。这事大任务真正开始执行。使用后台进程代替事件分派进程,防止任务在进行时,用户任务阻塞了。

    2.当后台进程完成后,task实例在事件分派进程中调用done方法。

    3.这个实例保持一个绑定属性,progress,它更新指示任务进度。另外,propertyChange方法在每次progress改变时都会被调用

    (下一篇文章会介绍Worker Threads and SwingWorker (工作者线程和Swing工作者)和Concurrency in Swing (Swing中的并发))

    demo程序中的后台任务,冒充一个真正的任务,她在随机时间间隔之间反馈进度数量。properChange方法通过更新进度条,对任务的progress属性的改变做出响应。

 

public void propertyChange(PropertyChangeEvent evt) {
    if (!done) {
        int progress = task.getProgress();
        progressBar.setValue(progress);
        taskOutput.append(String.format(
                "Completed %d%% of task.\n", progress));
    }

     注意:done方法设置done字段为true,防止propertyChange对进度条作更新。这是必须的,因为progress属性的最后更新发生在done调用之后,而progress属性的改变会调用propertyChange。

(2)使用不确定模式进度条


 

    在ProgressBarDemo2.java 中,模式设置为不确定,知道真正的进度开始位置:

public void propertyChange(PropertyChangeEvent evt) {
    if (!done) {
        int progress = task.getProgress();
        if (progress == 0) {
            progressBar.setIndeterminate(true);
            taskOutput.append("No progress yet\n");
        } else {
            progressBar.setIndeterminate(false); 
            progressBar.setString(null);
            progressBar.setValue(progress);
            taskOutput.append(String.format(
                    "Completed %d%% of task.\n", progress));
        }
    }
}

     代码改变部分与关字符串显示相关。一个显示字符串的进度条应该比demo设计者设计的进度条高,我们自个决定,进度条应该仅在默认情况且为确定模式情况下,才显示字符串。然而,我们想要避免因为模式的改变而使得进度条高度改变,使得布局难看,因此,代码使用了setStringPainted(true),同时增加一个setString(“”)的调用,这样,就没有文本被显示了。接着,当进度条从不确定模式转变为确定模式时,调用setString(null)使得进度条显示默认字符串。

    我们没有移除事件处理器中progressBar.setValue的调用。这个调用不会造成危害,因为一个不确定模式不会使用自己的值属性,除非用它在状态字符串中显示。实际上,忧郁某些外观样式不支持不确定模式,所以保持进度条的数据尽可能更新是一种好的措施。

    (3)如何使用进度条监视器

    现在,我们重写ProgressBarDemo.java ,使用一个进度监视器代替进度条。以下是截图:



     一个进度监视器不能重复使用,因此每一次新任务开始时,一定有一个新的进度监视器被创建。demo中,每点击开始按钮,程序都会创建一个进度监视器。

    这句代码创建了进度监视器

progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this,
                                      "Running a Long Task",
                                      "", 0, task.getLengthOfTask());

     这句代码使用ProgressMonitor唯一的构造器创建监视器并初始化几个参数。

  • 第一个参数:进度监视器提供了弹出对话框的父组件
  • 第二个参数:一个描述被监视任务性质的字符串。这个字符串会显示在对话框上。
  • 第三个参数:一个字符串,提供可可改变的状态注解。如果你使用null作为参数,这个注解就会忽略。这个例子在每次progress属性改变时都更新了注解。
int progress = task.getProgress();
String message = String.format("Completed %d%%.\n", progress);
progressMonitor.setNote(message);
progressMonitor.setProgress(progress);
taskOutput.append(message);
  •  最后两个参数:分别提供了对话框中进度条显示的最大和最小值

    默认情况下,一个进度监视器在决定是否弹出对话框前,至少等待一个最小时间,500毫秒。它同样花大于最小时间去等待progress作改变。如果计算出任务将会花费超过2000毫秒才能完成,进度对话框会显示。调用setMillisToDecidedToPopup调整“确定是否弹出进度监视器”之前要等待的时间量。调用setMillisToPopup调整“显示弹出监视器花费的时间量 ”。

    这个例子使用了一个进度监视器,它增加了一个功能。用户可以通过点击对话框上的cannel按钮取消任务。这里有一段代码,查询用户是否取消任务或是任务正常退出:

 

if (progressMonitor.isCanceled() || task.isDone()) {
    progressMonitor.close();
    Toolkit.getDefaultToolkit().beep();
    if (progressMonitor.isCanceled()) {
        task.cancel(true);
        taskOutput.append("Task canceled.\n");
    } else {
        taskOutput.append("Task completed.\n");
    }
    startButton.setEnabled(true);
}

 

    注意:并不是进度监视器自身取消任务。可以利用GUI和API使程序容易实现这些功能。

(4)确定使用进度条还是进度监视器

    下列情况可能更适合使用进度条:

  • 你想对进度条的配置进行更多的控制。如果你直接利用进度条工作,你可以设置它为不确定模式,或者让它垂直显示,进度条中显示字符串,在进度条上注册监听器,控制进度条的最大最小和当前值
  • 需要伴随进度条显示其他组件
  • 你需要多个进度条。多任务下,你需要监视不止一个因素(之前的因素是progress变量)。例如,一个安装程序可能监视磁盘可用空间,同时监视已经成功安装多少文件。
  • 你需要重复使用进度条。一个进度条可重复使用,进度监视器则不可以。一旦进度监视器决定了显示(或不显示)进度监视器,这个进度监视器只为当前工作,不能在被其他所使用。

 

    下列情况可能更适合使用进度监视器:

  • 如果你想简单的在对话框中显示进度
  • 所运行的任务是不重要的,用户可能不关心他具体进度。进度监视器提供了一个方法,让用户屏蔽对话框,即便任务还在运行。
  • 你想要容易地取消任务。进度监视器提供了GUI让用户取消任务。你要做的只是调用监督监视器的isCanceled方法,确定用户是否摁下取消按钮。
  • 你的任务在运行期间需要周期性显示一些简短信息。进度监视器对话框提供了setNote方法,这样你的任务就可以提供更多信息。例如,一个安装任务可能会反馈每个安装文件的名字。
  • 任务耗时不长。你确定用户有足够长的时间了解运行任务的目标和效果。如果任务在一个可设置的时间内完成,进度监视器将不会弹出(默认2秒)。

    如果你决定使用进度监视器,并且你所监视的任务是从一个输入流中读取数据,你可以使用ProgressMonitorInputStream类

(5)ProgressMonitorInputStream输入流进度监视器的使用

 

public class ProgressMonitorInputStreamDemo {
	public static void main(String[] args) {
		int len = 0;
		String filePath = "C:\\Documents and Settings\\Administrator\\桌面\\http小记.txt";
		byte[] b = new byte[30];
		JTextArea text = new JTextArea(20,20);
		JFrame  f = new JFrame();
		f.setSize(330,300);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(text,BorderLayout.CENTER);
		f.setVisible(true);
		try{
			FileInputStream input = new FileInputStream(filePath);
			ProgressMonitorInputStream in =
				new ProgressMonitorInputStream(f,"读取某某某文件",input);
			while( (len=in.read(b)) != -1){
				String s = new String(b,0,len);
				text.append(s);
				//delay 3 seconds to see progress bar clearly since the file is too small
				Thread.sleep(3000);
			}
		}catch(InterruptedException e){}
		catch(IOException e){}
	}
}

 效果:



     由于需要估算该输入流的可读长度,所以对话框弹出稍慢,某些设置可以参考进度监视器的。

  • 大小: 850 Bytes
  • 大小: 299 Bytes
  • 大小: 9.6 KB
  • 大小: 6 KB
  • 大小: 8.8 KB
  • 大小: 17.7 KB
  • 大小: 12.6 KB
分享到:
评论

相关推荐

    Unity Progress Bar Scripts进度条插件

    Unity Progress Bar Scripts是一款专为Unity游戏开发者设计的实用插件,它提供了丰富的进度条界面元素,帮助开发者在游戏或应用程序中实现动态展示加载、进度、健康值等信息。这款插件以其直观易用和高度可定制性而...

    Skinned Progress Bar.rar_progress_progress bar

    首先,"Skinned Progress Bar"可能使用了一种皮肤系统,允许开发者通过更换不同的样式、颜色和动画效果来改变进度条的外观。这通常涉及到CSS(层叠样式表)或XML文件,通过这些文件可以定义控件的视觉属性,如边框、...

    Progress Bar.7z

    "Progress Bar.7z"是一个专门针对Unity设计的进度条插件,可以在Unity Asset Store中找到,尽管它是付费的,但其提供的丰富样式和易用性使得它值得投资。 该插件包含了8种不同的进度条样式,每种样式都是一个预制件...

    精美progress bar

    在IT行业中,进度条(Progress Bar)是一种常见的用户界面元素,用于显示任务的完成状态,如数据加载、文件传输或计算过程。它们为用户提供了一种可视化的方式,了解操作的进度和预计剩余时间,从而增强用户体验。...

    MFC-Progress-bar-control.rar_MFC progress_MFC 进度条_mfc progress b

    MFC进度条使用,本实例实现了一个渐变颜色的进度条。

    react-native progress bar 原创

    例如,使用`Progress.Bar`: ```jsx import React, { useState } from 'react'; import { View } from 'react-native'; import Progress from 'react-native-progress'; const ProgressBar = () => { const ...

    Material Linear Progress Bar for your iOS apps.zip

    "Material Linear Progress Bar for your iOS apps"是一个开源项目,旨在为iOS应用提供类似Google Material Design风格的线性进度条。 这个项目的核心目标是将Android上Material Design的线性进度条体验带到iOS平台...

    android smooth progress bar

    在Android开发中,Progress Bar是用户界面中常见的一种组件,用于显示某个操作的进度或等待状态。"android smooth progress bar" 提供了一种平滑、美观且高度可定制的Progress Bar解决方案,尤其适用于那些需要优雅...

    IOS应用源码之效果很炫的progress bar .rar

    接下来,我们将深入探讨iOS中Progress Bar的使用、自定义以及如何创建具有独特视觉效果的进度条。 1. **UIKit框架中的Progress Bar** iOS系统提供了UIKit框架,其中UIProgressView是用于展示进度的标准控件。它...

    time-progress-bar-src.zip_SIDE BY SIDE_Time_Time Progress Bar_Ti

    The control displays a progress bar. This bar is colored with TimeMainColor and represents the total time of the task. The progress is indicated by an indicator rectangle which is colored with ...

    Ajax Progress Bar

    Ajax Progress Bar 是一种在网页上显示异步操作进度的技术,常用于文件上传、大数据处理等场景,为用户提供实时反馈,提升用户体验。它结合了Ajax(异步JavaScript和XML)技术与进度条界面元素,实现非刷新页面状态...

    jquery 进度插件 Progress Bar Plugin

    jQuery Progress Bar Plugin是一款易于使用的进度条插件,它可以轻松地创建动态显示进度的条形图。这个插件通常用于文件上传、数据加载或任何需要反馈进度的操作。它通过简单的API调用,允许开发者定制样式、颜色、...

    progress bar.zip

    "progress bar.zip" 文件包含的资源是关于加载进度条的GIF动画图片素材,主要用于在页面内容正在加载时向用户展示进度状态。这种加载指示器有助于缓解用户的等待焦虑,提高他们对网站或应用的满意度。 进度条通常...

    progress bar for css

    在网页设计中,进度条(Progress Bar)是一个重要的交互元素,它用于显示任务或数据加载的进度。在CSS(Cascading Style Sheets)中实现进度条可以为网站增添美观且功能性的界面。本文将深入探讨如何使用CSS创建一个...

    可用于ionic的progress bar

    "可用于Ionic的Progress Bar" 是一个专为这个流行的混合移动应用框架设计的CSS3特效集合,旨在提升应用程序中加载条(Progress Bar)的表现力。这个资源包含8种不同的进度条动画效果,这些效果源自开源的“single ...

    50个进度条progress bar

    在网页设计和开发中,进度条(Progress Bar)是一个重要的元素,它用于向用户展示某个操作的进度,比如数据加载、文件上传或下载等过程。"50个进度条progress bar"这个资源集合显然提供了多样化的进度条设计,旨在...

    jquery progress bar进度条插件,投票进度条系统

    创建一个基本的jQuery Progress Bar,你需要首先引入jQuery库和Progress Bar插件的CSS及JS文件。这些文件通常包括`jquery.js`、`jquery-ui.css`和`jquery-ui.js`,在本例中可能包含在名为`texiao6140_1560680961`的...

    This is the source for a Progress Bar control. Also includes

    描述中提到的"helpful example"可能是指包含了一个演示如何使用这个Progress Bar控制的实例。开发者通常会提供示例代码或者测试用例来帮助其他程序员更好地理解和应用他们的代码。这个例子可能是通过一个名为...

    Systray Progress Bar.zip_progress

    标题中的"Systray Progress Bar.zip_progress"表明这是一个与系统托盘区(Systray)相关的项目,特别地,它涉及到在任务栏的系统托盘区域显示进度条(ProgressBar)的功能。这种技术常用于告知用户某个后台进程的...

    Android file upload with progress bar

    "Android file upload with progress bar"这一主题涉及的技术点主要包括文件操作、网络请求以及UI更新。 首先,我们需要了解Android中的文件操作。Android提供了多种方式读写文件,如`java.io`包中的`File`类,或者...

Global site tag (gtag.js) - Google Analytics