`
caleb_520
  • 浏览: 247823 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

具有进度条的文件拷贝小程序

阅读更多
今天写一个具有进度条的文件拷贝小程序。也就是大家平常经常看见拷贝文件时候的进度条。当然此程序是用Java实现的。好了闲话少说,马上给出具体的程序代码和截图。

1、首先创建一个CopyFrame类。这类是文件拷贝的窗口主界面
package javait.org.filecopy;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class CopyFrame extends JFrame {
	private ContentPanel contentPanel;
	private ProgressBarPanel progressBarPanel;
	
	public CopyFrame() {
		super("文件拷贝小程序");
		init();
	}
	
	private void init() {
		this.setSize(350,250);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		
		contentPanel = new ContentPanel();
		progressBarPanel = new ProgressBarPanel();
		
		contentPanel.setProgressBarPanel(progressBarPanel);
		
		Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screen = kit.getScreenSize();
		Dimension frame = this.getSize();
		
		if (screen.width < frame.width) {
			frame.width = screen.width;
		}
		
		if (screen.height < frame.height) {
			frame.height = screen.height;
		}
		
		int locationWidth = (screen.width - frame.width) / 2;
		int locationHeight = (screen.height - frame.height) / 2;
		this.setLocation(locationWidth, locationHeight);
		
		this.getContentPane().add(contentPanel);
		this.getContentPane().add(progressBarPanel, BorderLayout.SOUTH);
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new CopyFrame();
	}
}


2、创建ContentPanel类,此类主要放置按钮、文本框等基本组件。
package javait.org.filecopy;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ContentPanel extends JPanel implements ActionListener, Runnable {
	private JButton srcButton;
	private JButton targetButton;
	private JButton copyButton;
	
	private JTextField srcTextField;
	private JTextField targetTextField;
	
	private ProgressBarPanel progressBarPanel;
	
	private Thread thread;
	
	private FileInputStream fis;
	private FileOutputStream fos;
	
	String fileName = ""; //文件的名字
	
	public void setProgressBarPanel(ProgressBarPanel progressBarPanel) {
		this.progressBarPanel = progressBarPanel;
	}

	public ContentPanel() {
		srcButton = new JButton("源文件");
		targetButton = new JButton("目标文件");
		copyButton = new JButton("拷贝");
		srcTextField = new JTextField(30);
		targetTextField = new JTextField(30);
		
		this.setLayout(null); //设置布局
	
		this.add(srcTextField);
		srcTextField.setBounds(55, 30, 140, 30);
		this.add(srcButton);
		srcButton.setBounds(195, 30, 80, 30);
		
		this.add(targetTextField);
		targetTextField.setBounds(55, 63, 140, 30);
		this.add(targetButton);
		targetButton.setBounds(195, 63, 80, 30);
		
		this.add(copyButton);
		copyButton.setBounds(195, 96, 80, 30);
		
		copyButton.addActionListener(this);
		srcButton.addActionListener(this);
		targetButton.addActionListener(this);
	}

	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		Object o = arg0.getSource();
		
		if (o == copyButton) {
			
			String src = srcTextField.getText();
			String target = targetTextField.getText();
			
			if ("".equals(src)) {
				JOptionPane.showMessageDialog(null, "请选择要被拷贝的文件,谢谢!");
				return;
			}
			
			if ("".equals(target)) {
				JOptionPane.showMessageDialog(null, "请选择目标文件的地址,谢谢!");
				return;
			}
			
			File srcFile = new File(src);
			System.out.println(target+fileName);
			File targetFile = new File(target+fileName);
			
			try {
				fis = new FileInputStream(srcFile);
				fos = new FileOutputStream(targetFile);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			thread = new Thread(this);
			thread.start();
		}
		
		if (o == srcButton) { //点击源文件按钮
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); //设置文件选择模式只能打开文件
			int result = fileChooser.showOpenDialog(this);
			if (result == 0) {
				File file = fileChooser.getSelectedFile();
				String path = file.getAbsolutePath();
				srcTextField.setText(path);
				srcTextField.setEditable(false); //设置文本框不可编辑
				fileName = file.getName();
			}
		}
		
		if (o == targetButton) { //点击目标地址按钮
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			int result = fileChooser.showOpenDialog(this);
			if (result == 0) {
				File file = fileChooser.getSelectedFile();
				String path = file.getAbsolutePath();
				targetTextField.setText(path);
				targetTextField.setEditable(false);
			}
		}
	}

	public void run() {
		// TODO Auto-generated method stub
		if (progressBarPanel != null) {
			try {
				byte[] b = new byte[1024];
				int size = fis.available();
				size = size - (size % 1024) + 1024;
				float per = (float) (100 / (size / 1024.0));
				int i = 0;
				CopyEvent e = new CopyEvent();
				while (true) {
					int len = fis.read(b);
					if (len == -1) break;
					fos.write(b, 0, len);
					e.setValue((int)(per * i));
					progressBarPanel.addEvent(e);
					i++;
				}
				fis.close();
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
}


大家注意:此ContentPanel实现了一个线程,主要是完进度条的滚动效果。

3、创建ProgressBarPanel类,该类继承一个JPanel面板,主要存放进度条组件,同时实现了一个自定义的监听器CopyListener
package javait.org.filecopy;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class ProgressBarPanel extends JPanel implements CopyListener {
	private JProgressBar bar;
	private JLabel label;
	
	public ProgressBarPanel() {
		bar = new JProgressBar(1, 100);
		bar.setStringPainted(true);
		bar.setValue(0);
		
		label = new JLabel("拷贝进度:");
		
		this.add(label);
		this.add(bar);
	}

	public void addEvent(CopyEvent e) { //在计算或者获取进度的拷贝文件进度值
		// TODO Auto-generated method stub
		/*if (e.getValue() == 100) {
			bar.setValue(100);
		}
		bar.setValue(e.getValue());*/
		if ((e.getValue() + 1) == 100) {
			bar.setValue(100);
		}
		bar.setValue(e.getValue() + 1); //设置进度条的百分比
	}
}


4、创建自定义一个监听器CopyListener
package javait.org.filecopy;

public interface CopyListener {
	public void addEvent(CopyEvent e);
}


5、创建自定义拷贝文件事件
package javait.org.filecopy;

public class CopyEvent {
	int value;

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
}


下面为了让大家能够看到上面程序的效果。我给出程序运行的效果图






  • 大小: 10.1 KB
  • 大小: 30.4 KB
  • 大小: 34 KB
  • 大小: 12.3 KB
3
0
分享到:
评论

相关推荐

    JAVA 带进度条的文件拷贝程序

    一个带界面的java小程序,可实现对所选任何类型的文件进行拷贝,并对此复制过程有进度条显示。代码风格良好,适合初学者借鉴。

    VC 复制文件程序带进度条 附源码

    VC 复制文件的小程序,,方便大家学习进度条

    DotNet带进度条下载更新升级组件(V1.1)

    1.1版本解决了1.0版本的一个bug,使用1.0缓存区过小,可能导致界面假死(实际上没有失去响应,可以点击按钮,原因是界面更新太快... 下载完成你可以处理诸如文件拷贝或者安装程序等各种操作,欢迎大家提出意见。

    课程设计基于Arm-Linux的可视化文件管理系统源码+项目说明.zip

    线程池:进行多文件、大文件拷贝。 内核链表:用于记录用户进入的路径、检索文件夹下内容、记录选中文件、即将拷贝的文件等操作。 MakeFile 项目管理 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的...

    大文件及文件夹上传(不错的程序)

    然后将在装有SDK的机器上配置过的security.config拷贝到客户机的.net framework的配置文件夹(%system%\Microsoft.NET\Framework\v2.0.50727\CONFIG)下,写了一个小程序可以直接实现这个功能但是这样会破坏客户机上...

    演练CProgress

    它通常用于安装程序、文件拷贝、磁盘格式等操作时的工作进度提示。 二、CProgress控件的使用方法 CProgress控件的使用方法主要有两步:创建CProgress控件对象和设置CProgress控件的属性。 1. 创建CProgress控件...

    XP系统启动文件被删除后的症状.doc

    将从另外的电脑上拷贝的132k同名的文件粘贴到原文件夹里后,重启机器,没出现进度条,直接出现的提示是:“我们对给你造成的不便非常抱歉,但windows没有成功启动可能是由于最近的硬件或软件更改造成的”,并反复...

    重复文件查找王 v1.8.rar

     3,免费版本不能使用“拷贝”重复文件和“导出”重复文件的功能。注册后的付费版本将具有这个功能。  对于试用版本的说明:为了帮助我们更好地发展后续更新版本,请您在试用本软件感觉满意后,对软件进行注册,才...

    DirectX Jun2010 redist最新完整安装包

    本程序为静默安装,安装时没有安装界面,只有拷贝文件进度条。安装完成后程序会自动结束,只要没有提示程序遇到错误,即说明安装成功。 安装完成后,大家可以自己验证是否安装成功,打开 “C:\Windows\System32\...

    大白菜超级u盘装机工具

    自行准备一个重装的ISO/GHO镜像,(微软官网或MSDN 下载),将系统镜像文件拷贝到U盘里 。 本软件涉及对可移动磁盘的读写操作,部分杀毒软件和安全类软件会导致制作失败,运行程序前请关闭相关软件! 2、插入U盘后,...

    《月影短信》免费编程接口(DLL)

    §免安装,拷贝到当前目录或者Windows的System目录即可调用,删除就是卸载,没有残留文件或者注册表垃圾。 §编程接口开放、友善,充分考虑软件开发者的切身需要,把软件开发者的编程工作量降至最低。 §支持各大...

    Visual C++实效编程百例光盘源代码

     实例70 拷贝、删除和移动文件   实例71 读写INI文件   实例72 读写大块资料(二进制)文件   实例73 文件变更通知  第8章 数据库   实例74 格式化数字   实例75 中文大写数字   实例76 存取...

    VC++6.0实效编程百例

    70·拷贝,删除和移动文件 71·读写INI文件 72·读写大块资料(二进制) 73·文件变更通知 第八章 74·格式化数字 75·中文大写数字 76·存取图象字段 77·ADO控制access数据库 78·SQL语句中设置时段检索条件 79·...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    程序天下:JavaScript实例自学手册

    20.15 执行客户端的可执行程序 20.16 自动调用OutLook发送邮件 20.17 弹出窗口选择颜色 20.18 弹出框式邮件发送 20.19 把网站作为用户的Active桌面 20.20 判断是否安装了flash插件 第21章 流行技术:DOM和userData的...

    《程序天下:JavaScript实例自学手册》光盘源码

    20.15 执行客户端的可执行程序 20.16 自动调用OutLook发送邮件 20.17 弹出窗口选择颜色 20.18 弹出框式邮件发送 20.19 把网站作为用户的Active桌面 20.20 判断是否安装了flash插件 第21章 流行技术:DOM和userData的...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    黑色幻想舞曲程序2.0

    本程序采用PHP+mysql编写:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长 DIY 自己的网站提供了强有力的支持。 高效率标签缓存机制:允许对类同的标签进行缓存,...

Global site tag (gtag.js) - Google Analytics