Java利用线程模拟文件复制的进度显示

一、实验内容

利用线程模拟文件复制的进度显示,点击“复制文件”,开始显示进度条,并实时显示复制进度,复制完成后显示“文件复制已完成!”,点击“取消”,取消复制,进度条归零,点击“×”可以退出系统,注意复制按钮和取消按钮在同一时间,只有一个可用

二、实验原理

  • 将窗口划分为三个面板,设置为3行1列网格布局
  • 第一行添加复制文件取消这两个按钮组件,在动作事件监听方法中设置复制文件和取消两个按钮是互斥
  • 第二行添加JLabel组件用于文字显示复制进度
  • 第三行添加JProgressBar进度条组件,并设置为水平进度条,采用确定性进度条,显示当前进程的进度

三、运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码:

package 线程模拟文件复制;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by Henry
 * Date: 2019/11/11
 * Time: 11:11
 */
public class CopyFilesProgressBar extends JFrame implements ActionListener {
    /**
     *  利用线程模拟文件复制的进度显示
     */
    private static final long serialVersionUID = 1L;

    JButton jbt_copy, jbt_cancel;
    JLabel jbl_show;
    JProgressBar jpbar;
    CopyFilesThread copyfilesthread;

    CopyFilesProgressBar() {
        super("文件复制进度条演示");
        this.setBounds(100, 200, 550, 300);
        this.getContentPane().setLayout(new GridLayout(3,1));
        this.setResizable(false);
        JPanel jp1 = new JPanel();
        jbt_copy = new JButton("复制文件");
        jbt_copy.addActionListener(this);
        jp1.add(jbt_copy);

        jbt_cancel = new JButton(" 取消  ");
        jbt_cancel.setEnabled(false);
        jbt_cancel.addActionListener(this);
        jp1.add(jbt_cancel);
        this.getContentPane().add(jp1);

        JPanel jp2 = new JPanel();
        jbl_show = new JLabel();
        jp2.add(jbl_show);
        this.getContentPane().add(jp2);

        JPanel jp3 = new JPanel();
        jpbar = new JProgressBar();
        jpbar.setOrientation(JProgressBar.HORIZONTAL);  //设置水平进度条
        jpbar.setMinimum(0);
        jpbar.setMaximum(100);
        jpbar.setValue(0);
        jpbar.setStringPainted(true);
        jpbar.setForeground(Color.ORANGE);
        jpbar.setPreferredSize(new Dimension(600,30));  //设置进度条的宽度和高度
        jpbar.setBorderPainted(true);
        jpbar.setIndeterminate(false);   //采用确定性进度条
        jp3.add(jpbar);
        this.getContentPane().add(jp3);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==jbt_copy) {
            copyfilesthread = new CopyFilesThread(jpbar, jbt_copy, jbl_show);
            copyfilesthread.start();
            jbt_copy.setEnabled(false);  //设置复制按钮不可用
            jbt_cancel.setEnabled(true);  //设置取消按钮可用
        }
        if(e.getSource()==jbt_cancel) {
            copyfilesthread.stop();
            jbt_copy.setEnabled(true);    //设置复制按钮可用
            jbt_cancel.setEnabled(false);  //设置取消按钮不可用
            jbl_show.setText("");
            jpbar.setValue(0); //进度条恢复到最初状态
        }
    }

    public static void main(String[] args) {
        new CopyFilesProgressBar();
    }

    static class CopyFilesThread extends Thread {
        JProgressBar jpbar;
        JButton jbt;
        JLabel jbl;
        CopyFilesThread(JProgressBar jpbar, JButton jbt, JLabel jbl) {
            this.jpbar = jpbar;
            this.jbt = jbt;
            this.jbl = jbl;
        }
        public void run() {
            for(int i = jpbar.getMinimum(); i <= jpbar.getMaximum(); i++) {
                try {
                    jpbar.setValue(i);
                    jbl.setText("文件复制已完成"+i+"%");
                    Thread.sleep(60);  //模拟文件复制耗时
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
            jbl.setText("嘿嘿,文件复制完成啦!");
        }

    }

}


嘻嘻,这是一个学校的Java课程中我觉得还是挺有意思的练习,所以自己做了之后记录下来和大家分享
如有不周到之处,欢迎大家提出指正~~
在这里插入图片描述

发布了14 篇原创文章 · 获赞 30 · 访问量 5190

猜你喜欢

转载自blog.csdn.net/qq_43974000/article/details/104277612