`
caleb_520
  • 浏览: 250428 次
  • 性别: 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编程中,创建一个带有进度条的文件拷贝程序是一项实用技能,尤其对于那些希望增强用户界面体验的开发者来说。下面将详细讲解这个“JAVA 带进度条的文件拷贝程序”的核心知识点。 首先,我们需要理解的是,...

    VC++带进度条的文件拷贝源码

    通过以上步骤,你可以构建一个能够显示进度条的文件拷贝程序。理解这些知识点并熟练应用,将有助于你在VC++编程中创建更高效、用户友好的应用程序。在实际编程中,可能还需要考虑其他因素,如文件大小的预估、进度条...

    回调进度条拷贝文件

    在进度条的上下文中,回调通常用于在文件拷贝过程中更新进度信息。例如,每当文件拷贝完成一部分,就会触发回调函数,该函数负责更新进度条的显示。 在实现带进度条的拷贝文件功能时,开发者可能使用了多线程或者...

    进度条拷贝文件

    在创建一个带有进度条的文件拷贝功能时,我们需要理解几个核心概念和技术。 首先,让我们来了解一下`TProgressBar`组件。在Delphi中,`TProgressBar`是用于显示进度信息的控件,它通常被用来指示一个操作的进度,...

    C# 拷贝文件时的进度条

    在C#编程中,实现文件...通过以上步骤,你可以构建一个基础的C#文件拷贝程序,它在拷贝过程中显示进度条,提供更好的用户体验。在实际项目中,你还可以根据需求扩展功能,如添加取消拷贝的选项、显示速度等额外信息。

    Qt 复制文件 实现进度条显示

    在Qt框架下,实现文件复制并伴随进度条显示是一项常见的任务,这有助于用户了解操作进度,提高用户体验。这里我们将深入探讨如何使用QFile、copy函数以及QProgressBar来完成这一功能。 首先,`QFile`是Qt提供的一个...

    java swing拷贝文件进度条

    这篇博客“java swing拷贝文件进度条”可能讲述的就是如何在Java Swing应用程序中创建一个具有文件拷贝功能,并且伴有进度条展示拷贝进度的组件。 在Java中,我们可以使用java.io包中的FileInputStream和...

    根据文件大小显示复制进度条

    在C#编程中,创建一个根据文件大小显示复制进度条的功能是一项常见的任务,尤其是在开发用户界面(UI)或者处理大量数据传输的应用程序时。对于初学者来说,理解这个过程可以帮助他们更好地掌握C#中的事件处理、多...

    拷贝文件的例子有拷贝进度条

    主线程负责用户界面的更新,而另一个工作线程则执行实际的文件拷贝操作。这样,拷贝操作不会阻塞用户界面,确保系统的响应性。 3. **用户界面更新**:在拷贝过程中,进度条需要实时反映拷贝进度。这通常通过调用...

    MFC文件拷贝程序MFC文件拷贝程序

    要实现文件拷贝,我们需要创建两个CFile对象,分别对应源文件和目标文件,然后通过读取源文件并写入目标文件来完成拷贝过程。 首先,我们需要打开源文件。可以使用CFile的成员函数Open(),传入文件路径和访问模式。...

    文件拷贝程序MFC

    【文件拷贝程序MFC】是基于VC++6.0集成开发环境下的一个应用程序,它利用Microsoft Foundation Classes (MFC)库来构建。MFC是一个C++类库,它为Windows API提供了一种面向对象的封装,使得开发者可以更加方便地进行...

    根据文件大小显示文件复制进度条,源代码

    进度条是一种常见的反馈机制,它能够让用户了解程序执行的进度,特别是在进行大文件复制或长时间操作时,提供了一种直观的反馈。本主题主要围绕如何在C#编程环境下实现“根据文件大小显示文件复制进度条”的功能。 ...

    API拷贝、删除、替换文件带进度条VB源码

    通过上述知识点,开发者可以在VB环境中实现API拷贝、删除、替换文件带进度条的功能,提高应用程序的用户友好性和效率。同时,理解这些概念对于任何VB程序员来说都是至关重要的,因为它们涉及到与操作系统底层的交互...

    文件拷贝工具

    在描述中提到,这个特定的文件拷贝工具已经经过了较长时间的实际应用并且保持了程序的稳定性,这意味着它已经在多种场景和环境下证明了自己的可靠性和效率。 在文件拷贝过程中,工具可能具备以下特性: 1. **多...

    文件批量拷贝、剪切小工具源码-C#

    这个“文件批量拷贝、剪切小工具源码-C#”就是为了解决这类问题而设计的。C#是一种强大的面向对象的编程语言,由微软公司开发,广泛应用于Windows平台上的应用开发,包括桌面应用、Web应用以及游戏开发等。 在这个...

    delphi拷贝文件源码.rar_delphi 拷贝_拷贝文件

    本篇文章将详细解析如何使用Delphi来实现文件拷贝,并结合进度条控件(ProcessBar)来显示拷贝过程的进度,提升用户体验。 首先,我们需要了解在Delphi中进行文件操作的基本函数。`TFile` 和 `TFileStream` 是两个...

    飞针文件拷贝

    传统的文件拷贝操作可能由于系统资源的占用或网络速度的影响而变得缓慢,VB文件拷贝程序通过优化算法和多线程处理,可以有效地解决这个问题。 首先,我们需要了解VB中的文件操作。VB提供了丰富的文件系统对象...

    MFC自绘进度条——可修改颜色

    `GradientProgressCtrl.h`文件则包含了类的声明,可能还包括了一些属性(如进度条颜色、背景色等)和方法(如设置颜色和百分比)的定义。 `MemDC.h`是一个自定义的内存设备上下文类,它通常用来提高绘制性能。`...

    delphi U盘管理 拷贝 复制

    标题中的“delphi U盘管理 拷贝 复制”指的是使用Delphi编程语言来实现对U盘的管理和文件拷贝复制功能。Delphi是一款强大的面向对象的集成开发环境(IDE),它基于Pascal语言,特别适合于快速开发Windows应用程序。...

    拷贝文件的例子有拷贝操作的进度 (6KB)...

    文件拷贝的过程中,开发者可能还考虑了错误处理,例如,当源文件不存在、目标路径无效或者磁盘空间不足时,程序应能够捕获这些异常并给出相应的错误提示。 总的来说,这个例子展示了如何在Windows环境下利用Visual ...

Global site tag (gtag.js) - Google Analytics