基于JavaAPI的进度条的设计与实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最大值 . 程序在 actio nPerf ormed ( ) 方 法中接着创建了 一个 Co pyF iles 类的 ope rat ion 实例 , 并将 Prog ressM oni to rExample 类 的 contentP ane 实例 对象 作为 它的属性改变事件的监听器 , 最后执行该 operation 实例 . CopyFiles 类派 生自 SwingW orke r 类 , 所以实 际上是调用其 继承的 ex ecute ( ) 方法 , 也就是安排 operation 实例在后台执行 . 通常情况下 , 总是将比 较耗时的操作安排在后台运行 , 这样可以保证 G UI 仍然处于活动状态 . 当文件拷贝操作开始后 , 进度监视对话框并不 会马上弹出 . 在 默认情 况下 P rogressM oni to r 会等 待 500 ms 后再决定是否显示对话框图 . 如果届时任 务已完 成 , P rog ressM onito r 则不会 显示 相关 对话 框. 可通过调用其 se tMi lli sT o Decide T oPopup( ) 方 法来设定此时间延迟属性 , 此属性的缺省值为 2 s . 真正拷贝文件的 操作是在 doInBackg round ( ) 方法中进行 , 程序在 Copy Files 类中覆盖了 Swi ngWo rker 类中对应的抽象方法 , 代码范例 3 如下 : public Void do InBackg round( ) 狖 int prog ress = 0 ; se tP rog ress( 0) ; Fi le [ ] f iles = srcDi r . listFiles( ) ; lo ng t ot alBy tes = calcT o talBy t es( fi le s) ; lo ng by t esCopied = 0 ; w hile ( prog ress < 100 && ! isCancelled( ) ) 狖 f or ( File f : f iles) 狖 Fi le destFile = new Fi le ( destDi r , f . get Name ( ) ) ; lo ng previo usLen = 0 ; t ry 狖 InputS tream in = new Fi leInputS tream( f) ; OutputSt ream out = new FileOutputSt ream ( dest File) ; byt e[ ] buf = new by te[ 1024] ; int co unte r = 0 ; int len ; w hi le ( ( len = in . read( buf) ) > 0) 狖 out . w rite ( buf , 0 , len) ; count er += len ; · 29 ·
收稿日期 : 2009-04 -08
2 范例程序的设计与实现
本文中应用程序的类名假定为 Prog ressM onitorEx ample , 它继承了 javax . sw ing . JPanel 类 , 同时 在此类中还实现了 2 个必须的事件处理接口 : java . aw t . event . ActionLi st ener 以及 java . beans . P roperty ChangeLi st ener . 在 P rog ressM onito rExample 类的主方法中通过创建一 个线程 ( Runnable) 以创 建程序的图形用户接口 , 代码范例 1 如下 : public static v oid mai n( S tring[ ] arg s) 狖 Sw ing Ut ilities . invokeL ater ( new Runnable ( ) 狖
« 机械与电子» 2009( 6)
by tesCo pied +=( dest File . lengt h( )- previo usLen) ; previousLen = destFi le . leng th( ) ; if ( counter > P ROGRESS CH ECKPOIN T by tesCo pied == t ot alBy tes) 狖 pro gress = ( int)( ( 100 * by tesCo pied) / to talByt es) ; counter = 0 ; Co pyData current = new CopyDat a( prog ress , f. getName( ) , get T o talKiloBy t es( t ot alBy tes) , get Kilo By tesCopied( byt esCopied) ) ; set Prog ress( progress) ; publi sh( current) ; 狚 狚 doInBackg round( ) 方法从in" 目 录中 获取 文 件 , 将它们依次复制到 o ut" 目录下 . 每当拷贝了一 定量的字节后 , 程序就会计算已完成工作量的百分 比 , 同时还会构造出一个内置 CopyData 类的实例 , 用它来保存百分比信息以及总共需要拷贝的字节数 和已完工的字节数 . 程序会根据计算出的百分比及 时更新绑定的进度属性 , 并且激发一个属性改变事 件. 通过调用 publish( ) 方法可以将拷贝任务的当前 进度信息通知给事件派发线程进行处理 . P rog ressM onit orExam ple 类的 property Change ( ) 方法 从属 性改变事件中取得进度值 , 使用此值作为实际参数 调用 set Prog ress ( ) 方法来及时更新进度监视动画 的效果 , 代码范例 4 如下 : public void property Change ( P ro pert yChang eEvent event) 狖 if ( pro gressM oni to r . i sCanceled( ) ) 狖 operati on . cancel( t rue ) ; 狚 else i f ( event . get P ropert yName ( ) . equal s( " pro gress" ) ) 狖 i nt prog ress = ( ( Integer )ev ent . getNew Value( ) ) . i nt Value( ) ; pro gressMo nit or . setP rog ress( pro gress) ; 狚 狚 Prog ressMo nit or 类还可以方便地判断 用户是 否已经取消操作 , 此例中当用户取消操作后 , 程序将 放弃进度监视活动 , 这种特性也可用在用户不希望 显示对话框 , 同时相关操作还需在后台执行的场景 · 30 ·
基于 Java API 的进度条的设计与实现
包子建 ( 上海工商外国语学院 , 上海 201300)
百度文库
Designing and Im plementing P rog ress Bar w ith Java API
BAO Zi -jian ( Shanghai I ndustr y and Comme rce F o reig n Language Colleg e , Shang hai 201300 , China )
« 机械与电子» 2009( 6)
· 28 ·
public v oid run( ) 狖 JF ram e f ram e = new JF ram e( " 基于 Jav a API 的进度条的设计与实现" ) ; f rame . set Default CloseOperatio n( JF rame . EXI T ON CL OSE) ; f rame . se tSize ( DEFA UL T F AU L T H EIG H T) ; JComponent content Pane = new P rog ressM onit orExam ple( ) ; cont ent Pane . setOpaque( true) ; f rame . setCont ent Pane ( content Pane) ; f rame . setVisible( t rue ) ; 狚 狚 ) ; 狚 在 Pro gressMo nit orEx ample 类中包 含一个 名 叫 Co pyF iles 的 内 置 类 , 它 继 承 了 javax . sw ing . Sw ingWo rker 类 . 当 用 户 单 击开 始 拷 贝 " 按钮 , Pro gressMo nit orEx am ple 类 的 actio nPe rf o rm ed ( ) 方法获取了此事件 , 它就会创建一个 Pro gressMo ni to r 对象并且在后台启动一个开始进行文件拷贝操 作的线程 , 代码范例 2 如下 : public void actionPerf ormed ( Acti onEvent event) 狖 File srcDi r = new File( " in" ) ; if ( srcDi r . exi st s( ) && ( srcDi r . li st Files( )! = null && srcDir . listF iles( ) . leng th > 0) ) 狖 File de stDir = new File( " o ut" ) ; pro gressMo nit or = new Pro gressMo nit or W IDT H , DE-
摘要 : 详细描述了一种进度条的设计与实现方 法 , 运用一个简单的应用程序示范了其设计思想 . 使 用多线程设计模式为已有的 P rog ressM onito r 类提 供了更多的功能 , 这样只需对已有的应用程序进行 少量的修改 , 就可充分获得因此而带来的好处 . 关键词 : 进度条 ; 设计 ; 实现 ; Java 中图分类号 : T P311 . 52 文献标识码 : A 文章编号 : 1001-2257( 2009) 06-0028-03 Abstract : T his article describes a new met hod to design and implem ent a prog ress ba r and use s a simple applicatio n t o demonstrat e the m ain co ncept s . T he applicati on uses t he m ul ti-thread desig n pat tern to provide additio nal functi onalit y to t he built-in P rog ressM oni to r class . T his allow s you to use and benefit f rom a new prog ress bar af ter m aking only minim al changes to y our existing application code base . Key words : prog ress bar ; desig ning ; implementing ; Java
0 引言
Java 语 言的 Sw ing 进 度 监 视 应 用 程 序 接 口 ( API) 包含了 3 个用来实现进度条的类 . 其一 , 派生 自 JCom ponent 类的 JProg ressBar 子 类 , 它是 用来 显示操作进度的图形控件 , 可以将它嵌入到其它图 形控件中 . 其二 , 派生自 Object 类的 P ro gressMo nito r 子类 , 它本身并不是图形控件 , 但可以用来监视 一个操作的执行过程 , 并弹出一个内置有进度条的 对话框 . 其三 , Prog ressM onit orInputSt ream 类 , 它
是一个带有进度监视器的流过滤器 , 当读取此流时 , 进度监视器会自动接收所读取字节数的更新 , 并在 其对话框中显示所完成工作的百分比 . 程 序员 通 过 在 程 序 中 使 用 P rog re ssM oni to r 类 , 可以方便地取消所监视的任务或允许用户在不 显示对话框时继续在后台执行任务 . P rog ressM onit or 类还可以在对话框中显示一个可以定时改变的 状态提示 . 本文的范例程序就利用 P rog re ssM oni to r 类设计与实现了带有此功能的进度条 .
( P rogressM oni to rExample . this , " 操作进行中 " , " " , 0 , 100) ; pro gressMo nit or . setP rog ress( 0) ; Prog ressMo nit or 仅有一个单一的构造方法 , 其 第 1 个参数为进度监视器对话框所在的父容器组件 对象 ; 第 2 个参数为 Object 类型 , 它会被显 示在对 话框当中 , 它可以是字符串 、 图标或容器组件 , 本例 中使用的是字符串 , 它用于报告用户所要求的操作 正在执行当中 ; 第 3 个参数作为可选的状态描述文 字 , 也会显示在对话框当中 , 它可以根据所监测任务 的执行情况随时更新 , 当无需状态描述文字时 , 只需 将之设置为空白的字符串即可 ; 第 4 和第 5 个参数 分别用来作为对话框中所显示的状态条的最小值和
1 范例程序
此范例程序的基本功能是将源目录( in) 中的文 件拷贝到目标目录( o ut) 中 , 其应用 Swi ng 图形用户 接口( GU I) , 允许用户通过点击 开始拷贝" 按钮开 始拷贝操作过程 . 当拷贝操作开始后 , 程序会构造一 个进度监视器 , 此进度监视器用来跟踪操作完成的 工作量 , 并在一个带有进度条的对话框中显示相关 信息 . 程序同时还会将其运行的动态过程输出到屏 幕上 . G UI 显示了已拷贝成功的字节数和当前正在 拷贝的文件名称 , 用户可以随时点击 取消"按钮以 终止操作 .