java swing中经常要使用到进度条,比如下载文件和拷贝文件时显示进度,如下图所示:
下载完成之后:
难点在于:在读取输入流的时候,实时更新进度条。
我自己定了一个规则:
(1) 若输入流的大小小于1024,则字节数组的长度就是输入流的大小。
(2)获取文件的大小,并平分为100等份,得到商1;
(3拿每一等份(商1)和1024比较:若小于等于1024,则字节数组大小为商1;
若大于1024,则除以1024,得到商2,则字节数组大小为商1/商2
规定:100%时的颜色为蓝色:copyProgressBar.setForeground(Color.blue);
核心代码:
/*** * 在实际使用过程中,应该放在线程中 * @param in * @param sourceSize * : 输入流的长度,即要读取的字节个数 * @param targfile */ public static void progress(JProgressBar copyProgressBar, InputStream in, long sourceSize, File targfile) { FileOutputStream target = null; try { int bytesArrLeng = 0; if (sourceSize < SystemHWUtil.BUFF_SIZE_1024) {// bytesArrLeng = (int) sourceSize; } else { long shangOne = sourceSize / SystemHWUtil.NUMBER_100; if (shangOne == 0) {// sourceSize<100 shangOne = shangOne + 1; } if (shangOne <= SystemHWUtil.BUFF_SIZE_1024) { bytesArrLeng = (int) shangOne; } else { long shangTwo = shangOne / SystemHWUtil.BUFF_SIZE_1024; if (shangOne % SystemHWUtil.BUFF_SIZE_1024 != 0) { shangTwo = shangTwo + 1L; } bytesArrLeng = (int) (shangOne / shangTwo); } } System.out.println("字节数组的长度是:" + bytesArrLeng); target = new FileOutputStream(targfile); byte[] buffer = new byte[bytesArrLeng]; int byteNum; long hasReadByte = 0L;// 已经读取的字节个数 float result; int progressSize = 0; while ((byteNum = in.read(buffer)) != SystemHWUtil.NEGATIVE_ONE) { target.write(buffer, 0, byteNum); hasReadByte = hasReadByte + byteNum; result = (float) ((double) hasReadByte / sourceSize); progressSize = Math.round(result * SystemHWUtil.NUMBER_100); // copyProgressBar.setString(progressSize + "%"); // copyProgressBar.setValue(progressSize); updateProgress(copyProgressBar, progressSize); } if (progressSize < SystemHWUtil.NUMBER_100) { progressSize = SystemHWUtil.NUMBER_100; updateProgress(copyProgressBar, progressSize); } copyProgressBar.setForeground(Color.blue); // System.out // .println("[SystemUtil:copyFile]:file copy successfully!"); // resultTextArea.setText(); } catch (Exception e) { e.printStackTrace(); // copyFileBtn.setEnabled(true); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } in = null; } if (target != null) { try { target.close(); } catch (IOException e) { e.printStackTrace(); } target = null; } } } /*** * 更新进度条上得进度数字 * @param copyProgressBar * @param progressSize */ private static void updateProgress(JProgressBar copyProgressBar, int progressSize) { copyProgressBar.setString(progressSize + "%"); copyProgressBar.setValue(progressSize); }
使用进度条的代码:
new Thread(new Runnable() { @Override public void run() { try { HttpSocketUtil.setDetail(true); // HttpSocketUtil.httpRequest(urlTF.getText(), null, // null, true, selectedFile, -1, -1); HttpURLConnection huc = HttpSocketUtil .beforeConnect(httpSenderApp.getUrlTF() .getText(), null, null, null, null, SystemHWUtil.NEGATIVE_ONE, SystemHWUtil.NEGATIVE_ONE); InputStream in = huc.getInputStream(); int contentLength; String sizeHeadKey = null; if (ValueWidget.isNullOrEmpty(sizeHeadKey)) {// 若header中没有size contentLength = huc.getContentLength(); } else { contentLength = Integer.parseInt(huc .getHeaderField(sizeHeadKey)); } ComponentUtil.progress( httpSenderApp.getCopyProgressBar(), in, contentLength, selectedFile); GUIUtil23.infoDialog("下载成功!size:" + FileUtils.formatFileSize2(selectedFile .length())); } catch (Exception e) { GUIUtil23.errorDialog(e.getMessage()); e.printStackTrace(); } } }).start();
依赖的jar:io0007-find_progess-0.0.7.2-SNAPSHOT.jar
demo:http-sender
注意:项目使用maven 构建
参考:
http://hw1287789687.iteye.com/blog/2246665
相关推荐
在Java Swing中实现文件拷贝并同时显示进度条是一项常见的任务,特别是在处理大文件时,让用户了解拷贝进度是提高用户体验的重要方式。下面我们将深入探讨如何使用Java Swing来创建这样一个功能。 首先,我们需要...
在处理文件上传时,Java的`java.io`和`java.nio`包提供了读取和写入文件的基本功能。对于批量操作,可以使用`java.util.ArrayList`或`java.util.List`来存储待上传文件的路径信息。 多线程技术是实现文件上传进度条...
例如,在Java中,我们可以使用`java.nio`包进行文件操作和`Swing`或`JavaFX`创建GUI进度条;在Python中,`os`和`shutil`模块可用于文件操作,而`tkinter`或`PyQt`可以用来创建进度条界面。 总之,"根据文件大小显示...
它常用于长时间运行的任务,如文件下载、数据处理或网络通信,为用户提供反馈,让他们知道程序仍在运行并且可以预期完成的时间。Swing组件是Java Foundation Classes (JFC)的一部分,提供了一套丰富的图形用户界面...
在GUI应用程序中,当执行耗时操作如文件读写、网络通信或大数据处理时,为了提高用户体验,通常会使用进度条(JProgressBar)来显示任务的进度。在某些情况下,我们无法预估任务的具体完成时间,这时我们可以使用...
在IT领域,尤其是在软件开发中,"复制文件并带有进度条"是一个常见的需求,尤其是在大量数据传输或长时间操作时,进度条能提供用户友好的体验,让用户了解操作的状态和预计剩余时间。本教程将深入探讨如何实现这个...
http://blog.csdn.net/r3lish/article/details/51912543 进度条:78%[===================> ]97.7K/s, will be finished in 75.59s 限速、文件网络地址、文件本地路径,均可在代码里修改。
这个“swingprogress”压缩包文件可能包含一个或多个示例代码,用于演示如何在实际项目中集成和使用Swing的进度条功能。通过阅读和学习这些代码,开发者能够更好地理解如何在Java GUI应用程序中有效地使用...
在实际开发中,这些类和示例可以帮助我们创建更友好的用户界面,特别是在执行耗时操作时,如文件上传、下载或大数据处理。通过自定义`ProgressBarUI`,我们可以使应用程序的界面更加个性化和专业。而使用`...
在IT领域,尤其是在桌面应用程序和GUI(图形用户界面)开发中,"多线程保存文件、显示进度条、对话框大小可变"是常见的需求,它们涉及到程序性能优化、用户体验提升以及界面交互设计等多个关键点。下面将详细阐述...
当上传进度发生变化时,更新UI界面上的进度条。这个过程通常分为以下几个步骤: 1. **创建上传任务**:创建一个表示文件上传的任务,包含文件路径、目标URL等信息。 2. **计算文件大小**:在上传前获取文件的总...
而在下载时,可能使用`retrieveFile()`方法将服务器上的文件下载到本地。 此外,为了实现文件的滚动上传,可能使用了`JProgressBar`组件来显示上传进度。这通常涉及到监听文件传输过程,更新进度条的值,以便用户...
综上所述,这个“JAVA 带进度条的文件拷贝程序”涉及到Java GUI编程的核心概念,包括Swing组件的使用、文件操作、多线程、事件监听以及异常处理。对于初学者而言,这是一个很好的实践项目,可以帮助他们更好地理解和...
本示例主要使用了Swing库中的组件,Swing是Java中的一个用于创建图形用户界面的工具包,提供了丰富的UI组件,包括`JProgressBar`(进度条)。 #### 关键代码解析 下面我们将对这段代码进行逐行分析: 1. **导入...
在这个"java Swing 文件批量上传 DEMO 源代码"中,我们关注的核心是利用Swing构建一个用户界面,实现文件和文件夹的批量上传功能。这涉及到多个Java Swing组件、事件处理以及文件I/O操作。 首先,Swing 提供了诸如...
当涉及到“下载带进度条”的功能时,我们关注的是用户界面(UI)与后台数据传输过程的交互,为用户提供可视化的下载进度反馈。这不仅提高了用户体验,也使用户能够更好地管理他们的下载任务。 首先,我们要理解下载...
下面将详细讲解如何使用Java的Swing库创建一个带有进度条的FTP文件上传功能。 首先,我们需要理解FTP的基本原理。FTP是一种用于在Internet上进行文件传输的标准协议。Java提供了一个内置的`java.net.FTPClient`类,...