package ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import thread.DownloadThread;
import util.Calculator;
import util.DownloadUtil;
public class DownloaderClient extends JFrame{
private static final long serialVersionUID = 1L;
public static long startTime;
private JTextArea infoArea;
private JProgressBar progressBar;
private JTextField pathField;
private JButton startButton;
private JButton cancelButton;
private JTextField fileField;
private JButton chooseButton;
private JFileChooser fileChooser;
private JComboBox threadNumComboBox;
public DownloaderClient() throws Exception{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
this.setTitle("多线程下载");
this.setSize(600,350);
this.setResizable(false);
Container contentPanel = this.getContentPane();
contentPanel.setLayout(new BorderLayout());
ButtonListener btnListener = new ButtonListener();
infoArea = new JTextArea();
infoArea.setLineWrap(true);
infoArea.setEditable(false);
JScrollPane scroll = new JScrollPane(infoArea);
//分别设置水平和垂直滚动条自动出现
scroll.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
progressBar = new JProgressBar(SwingConstants.HORIZONTAL, 0, 100);
//progressBar.setStringPainted(true);
JPanel centerPanel = new JPanel(new BorderLayout(5,2));
centerPanel.add(progressBar, BorderLayout.NORTH);
centerPanel.add(scroll,BorderLayout.CENTER);
JLabel pathLabel = new JLabel("下载路径:");
pathField = new JTextField(86);
JPanel pathPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,1,0));
pathPanel.add(pathLabel);
pathPanel.add(pathField);
startButton = new JButton("下载");
cancelButton = new JButton("取消");
startButton.addActionListener(btnListener);
cancelButton.addActionListener(btnListener);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(startButton);
buttonPanel.add(cancelButton);
JLabel fileLabel = new JLabel("保存路径:");
String currentDir = System.getProperty("user.dir");
fileField = new JTextField(currentDir+File.separator,54);
chooseButton = new JButton("浏览");
chooseButton.addActionListener(btnListener);
JLabel threadNumLabel = new JLabel(" 启用线程数:");
Object num[] = {1,2,3,4,5,6,7,8,9,10};
threadNumComboBox = new JComboBox(num);
threadNumComboBox.setSelectedItem(5);
JPanel filePanel = new JPanel(new FlowLayout(FlowLayout.LEFT,1,0));
filePanel.add(fileLabel);
filePanel.add(fileField);
filePanel.add(chooseButton);
filePanel.add(threadNumLabel);
filePanel.add(threadNumComboBox);
JPanel northPanel = new JPanel(new GridLayout(3,1,0,0));
northPanel.add(pathPanel);
northPanel.add(filePanel);
northPanel.add(buttonPanel);
contentPanel.add(northPanel,BorderLayout.NORTH);
contentPanel.add(centerPanel,BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private class CalculateThread extends Thread {
@Override
public void run() {
int flg = 0;
while (true) {
try {
Calculator.calculate();
infoArea.setText(Calculator.getMessage());
progressBar.setValue(Calculator.getProgress());
Thread.sleep(1000);
} catch (Exception e) {
infoArea.setText("");
infoArea.append("\n\n");
infoArea.append("错误信息:\n");
infoArea.append("--------------------------------\n");
infoArea.append(e.toString());
}
//为了让最后的画面停留在100%的时刻,让循环多进行一次,否则会停留在完成99%的画面上
if (DownloadUtil.isDownloadFinished()){
flg++;
if(flg == 2){
if(!DownloadThread.isCanceled)
infoArea.append("下载完成!");
else
infoArea.append("下载已取消!");
startButton.setEnabled(true);
break;
}
}
}
}
}
private class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==startButton){
DownloadThread.isCanceled = false;
String path= pathField.getText().trim();
String saveDir = fileField.getText().trim();
try {
int threadNum = (Integer) threadNumComboBox.getSelectedItem();
DownloadUtil.download(path,saveDir,threadNum);
startTime = System.currentTimeMillis();
CalculateThread ct = new CalculateThread();
ct.start();
startButton.setEnabled(false);
} catch (Exception e1) {
infoArea.setText("");
infoArea.append("\n\n");
infoArea.append("错误信息:\n");
infoArea.append("--------------------------------\n");
infoArea.append(e1.toString());
}
}else if(e.getSource()==chooseButton){
fileChooser = new JFileChooser(".");
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setDialogTitle("选择文件夹");
int ret = fileChooser.showOpenDialog(DownloaderClient.this);
if (ret == JFileChooser.APPROVE_OPTION) {
//文件夹路径
fileField.setText(fileChooser.getSelectedFile().getAbsolutePath()+File.separator);
}
}else if(e.getSource()==cancelButton){
DownloadThread.isCanceled = true;
}
}
}
/**
* http://download.5211game.com/11/download/5211install_1181.exe
* http://dldir1.qq.com/qqfile/qq/QQ2013/2013Beta5/6966/QQ2013Beta5.exe
* http://dldir1.qq.com/music/clntupate/QQMusic_Setup_90_900.exe
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
new DownloaderClient();
}
}
Java编写的多线程下载器源代码
5星 · 超过95%的资源 需积分: 16 12 浏览量
2013-06-20
08:38:37
上传
评论 3
收藏 29KB RAR 举报
nevermore602
- 粉丝: 9
- 资源: 7
最新资源
- 功率拓扑快速参考指南-ti,TI官方出品
- 开关电源拓朴图表,各种电路拓扑表格
- 登录和注册 前端:vue3+iview plus +axios 后台:spring boot +mybatis
- 软件测试入门简介:从基础到实践的全面介绍
- 2024CDA Level Ⅰ 认证考试大纲
- YOLO 数据集:淋巴病灶检测(1类别,包含训练集、验证集)
- 基于AT91RM9200处理器+XC3S250E(FPGA)+AD5322采集板Cadence ORCAD(硬件原理图+PCB)
- java+vue2实现zebra打印机,js实现
- J-link烧录软件,用于hex文件烧录
- VB打开时间同步页面/Internet时间设置.vbs
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页