一、实验内容
利用线程模拟文件复制的进度显示,点击“复制文件”,开始显示进度条,并实时显示复制进度,复制完成后显示“文件复制已完成!”,点击“取消”,取消复制,进度条归零,点击“×”可以退出系统,注意复制按钮和取消按钮在同一时间,只有一个可用。
二、实验原理
- 将窗口划分为三个面板,设置为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课程中我觉得还是挺有意思的练习,所以自己做了之后记录下来和大家分享
如有不周到之处,欢迎大家提出指正~~