📄 downloadmanager.java.bak
字号:
/*
* 项目名称:JAVA下载器
* 开发环境:WINDOW200
* 开发语言:JAVA
* 开发工具:EDITPKLUS
* 作者:魏勤
*
*/
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
//用于实现下载逻辑的类
class Download extends Observable implements Runnable //Runnable是实现线程的接口
{
private static final int MAX_BUFFER_SIZE=1024;
//定义下载的状态
public static final String STATUSES[]={"Downloading","Paused","Complete","Cancelled","Error"};
public static final int DOWNLOADING=0;
public static final int PAUSED=1;
public static final int COMPLETE=2;
public static final int CANCELLED=3;
public static final int ERROR=4;
private URL url;
private int size;
private int downloaded;
private int status;
//构造函数他是用来定义事例化类时(开以个对象)开始状态
public Download(URL url)
{
this.url=url;
size=-1;
downloaded=0;
status=DOWNLOADING;
download();
}
//获得下载的地址
public String getUrl()
{
return url.toString();
}
//获得下载文件的大小
public int getSize()
{
return size;
}
//获得下载时的进度
public float getProgress()
{
return ((float) downloaded / size )*100;
}
//获得下载时的状态
public int getStatus()
{
return status;
}
//用于暂停
public void pause()
{
status=PAUSED;
stateChanged();
}
//用于暂停后继续下载
public void resume()
{
status=DOWNLOADING;
stateChanged();
download();
}
//用于取消下载
public void cancel()
{
status=CANCELLED;
stateChanged();
}
//当下载出错时调用该方法
private void error()
{
status=ERROR;
stateChanged();
}
//用于下载的方法
private void download()
{
Thread thread=new Thread(this);
thread.start();
}
//获得保存文件的名称
private String getFileName(URL url)
{
String fileName=url.getFile();
return fileName.substring(fileName.lastIndexOf('/')+1);
}
//当状态改变时调用此方法
private void stateChanged()
{
setChanged();
notifyObservers();
}
//具体实现下载的逻辑
public void run()
{
RandomAccessFile file=null;
InputStream stream=null;
try
{
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestProperty("Range","bytes="+downloaded+"-");
connection.connect();
if ( connection.getResponseCode()/100!=2 )
{
error();
}
int contentLength=connection.getContentLength();
if (contentLength<1)
{
error();
}
if (size ==-1)
{
size=contentLength;
stateChanged();
}
file=new RandomAccessFile(getFileName(url),"rw");
file.seek(downloaded);
stream=connection.getInputStream();
while (status==DOWNLOADING)
{
byte buffer[];
if (size-downloaded>MAX_BUFFER_SIZE)
{
buffer=new byte[MAX_BUFFER_SIZE];
}
else
{
buffer=new byte[size-downloaded];
}
//读下载文件
int read=stream.read(buffer);
if (read==-1)
{
break;
}
//写入定义的文件
file.write(buffer,0,read);
downloaded+=read;
stateChanged();
}
if (status==DOWNLOADING)
{
status=COMPLETE;
stateChanged();
}
}
catch (Exception e)
{
error();
}
finally
{
if (file!=null)
{
try
{
file.close();
}
catch (Exception e)
{
}
}
if (stream!=null)
{
try
{
stream.close();
}
catch (Exception e)
{
}
}
}
}
}
//定义进度条的类
class ProgressRenderer extends JProgressBar implements TableCellRenderer
{
public ProgressRenderer(int min,int max)
{
super(min,max);
}
public Component getTableCellRendererComponent(
JTable table,Object value,boolean isSelected, boolean hasFocus
,int row,int column)
{
setValue((int)((Float)value).floatValue());
return this;
}
};
//定义一个表格模板
class DownloadTableModel extends AbstractTableModel implements Observer
{
private static final String[] columnNames={"URL","Size","Progress","Status"};
private static final Class[] columnClasses={String.class,String.class,JProgressBar.class,String.class};
private ArrayList downloadList=new ArrayList();
public void addDownload(Download download)
{
download.addObserver(this);
downloadList.add(download);
fireTableRowsInserted(getRowCount()-1,getRowCount()-1);
}
public Download getDownload(int row)
{
return (Download)downloadList.get(row);
}
public void clearDownload(int row)
{
downloadList.remove(row);
fireTableRowsDeleted(row,row);
}
public int getColumnCount()
{
return columnNames.length;
}
public String getColumnName(int col)
{
return columnNames[col];
}
public Class getColumnClass(int col)
{
return columnClasses[col];
}
public int getRowCount()
{
return downloadList.size();
}
public Object getValueAt(int row,int col)
{
Download download=(Download)downloadList.get(row);
switch (col)
{
case 0:
return download.getUrl();
case 1:
int size=download.getSize();
return (size==-1)?"":Integer.toString(size);
case 2:
return new Float(download.getProgress());
case 3:
return Download.STATUSES[download.getStatus()];
}
return "";
}
public void update(Observable o,Object arg)
{
int index=downloadList.indexOf(o);
fireTableRowsUpdated(index,index);
}
};
//把图形化界面布局出来,并通过事件机制实现下载功能
public class DownloadManager extends JFrame implements Observer
{
private JTextField addTextField;
private DownloadTableModel tableModel;
private JTable table;
private JButton pauseButton,resumeButton,cancelButton,clearButton;
private Download selectedDownload;
private boolean clearing;
public DownloadManager()
{
//设置窗口的标题
setTitle("Download Manager");
setSize(640,480);
//定义怎样退出窗口
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
actionExit();
}
});
JMenuBar menuBar=new JMenuBar();
JMenu fileMenu=new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
JMenuItem fileExitMenuItem=new JMenuItem("Exit",KeyEvent.VK_X);
fileExitMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
actionExit();
}
});
fileMenu.add(fileExitMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
JPanel addPanel=new JPanel();
addTextField=new JTextField(30);
addPanel.add(addTextField);
//事例化下载按扭
JButton addButton=new JButton("Add Download");
//当点击按扭时开始下载
addButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
actionAdd();
}
});
addPanel.add(addButton);
tableModel=new DownloadTableModel();
table=new JTable(tableModel);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
tableSelectionChanged();
}
});
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ProgressRenderer renderer=new ProgressRenderer(0,100);
renderer.setStringPainted(true);
table.setDefaultRenderer(JProgressBar.class,renderer);
table.setRowHeight(
(int)renderer.getPreferredSize().getHeight()
);
JPanel downloadsPanel=new JPanel();
downloadsPanel.setBorder(
BorderFactory.createTitledBorder("Downloads"));
downloadsPanel.setLayout(new BorderLayout());
downloadsPanel.add(new JScrollPane(table),BorderLayout.CENTER);
JPanel buttonsPanel=new JPanel();
//事例化暂停按扭
pauseButton=new JButton("Pause");
//当点击按扭时开始暂停
pauseButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
actionPause();
}
}
);
pauseButton.setEnabled(false);
buttonsPanel.add(pauseButton);
//事例化继续下载按扭
resumeButton=new JButton("Resume");
//当点击按扭时开始继续下载
resumeButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
actionResume();
}
}
);
resumeButton.setEnabled(false);
buttonsPanel.add(resumeButton);
//事例化取消按扭
cancelButton=new JButton("Cancel");
//当点击按扭时取消下载
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
actionCancel();
}
}
);
cancelButton.setEnabled(false);
buttonsPanel.add(cancelButton);
//事例化清空按扭
clearButton=new JButton("Clear");
//当点击按扭时清空下载记录
clearButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
actionClear();
}
}
);
clearButton.setEnabled(false);
buttonsPanel.add(clearButton);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(addPanel,BorderLayout.NORTH);
getContentPane().add(downloadsPanel,BorderLayout.CENTER);
getContentPane().add(buttonsPanel,BorderLayout.SOUTH);
}
private void actionExit()
{
System.exit(0);
}
//开始下载
private void actionAdd()
{
URL verifiedUrl=verifyUrl(addTextField.getText());
if(verifiedUrl!=null)
{
tableModel.addDownload(new Download(verifiedUrl));
addTextField.setText("");
}
else
{
JOptionPane.showMessageDialog(this,"Invalid Download URL","Error",JOptionPane.ERROR_MESSAGE);
}
}
private URL verifyUrl(String url)
{
if (!url.toLowerCase().startsWith("http://"))
{
return null;
}
URL verifiedUrl=null;
try
{
verifiedUrl=new URL(url);
}
catch (Exception e)
{
return null;
}
if (verifiedUrl.getFile().length()<2)
{
return null;
}
return verifiedUrl;
}
private void tableSelectionChanged()
{
if (selectedDownload!=null)
{
selectedDownload.deleteObserver(DownloadManager.this);
}
if (!clearing)
{
selectedDownload=tableModel.getDownload(table.getSelectedRow());
selectedDownload.addObserver(DownloadManager.this);
updateButtons();
}
}
//用于暂停的方法
private void actionPause()
{
selectedDownload.pause();
updateButtons();
}
//用于继续下载的方法
private void actionResume()
{
selectedDownload.resume();
updateButtons();
}
//用于取消下载的方法
private void actionCancel()
{
selectedDownload.cancel();
updateButtons();
}
//用于清空下载记录的方法
private void actionClear()
{
clearing=true;
tableModel.clearDownload(table.getSelectedRow());
clearing=false;
selectedDownload=null;
updateButtons();
}
//设置按扭的状态
private void updateButtons()
{
if (selectedDownload!=null)
{
int status=selectedDownload.getStatus();
switch (status)
{
case Download.DOWNLOADING:
pauseButton.setEnabled(true);
resumeButton.setEnabled(false);
cancelButton.setEnabled(true);
clearButton.setEnabled(false);
break;
case Download.PAUSED:
pauseButton.setEnabled(false);
resumeButton.setEnabled(true);
cancelButton.setEnabled(true);
clearButton.setEnabled(false);
break;
case Download.ERROR:
pauseButton.setEnabled(false);
resumeButton.setEnabled(true);
cancelButton.setEnabled(false);
clearButton.setEnabled(true);
break;
default:
pauseButton.setEnabled(false);
resumeButton.setEnabled(false);
cancelButton.setEnabled(false);
clearButton.setEnabled(true);
break;
}
}
else
{
pauseButton.setEnabled(false);
resumeButton.setEnabled(false);
cancelButton.setEnabled(false);
clearButton.setEnabled(false);
}
}
public void update(Observable o,Object arg)
{
if (selectedDownload!=null&& selectedDownload.equals(o))
{
updateButtons();
}
}
public static void main(String[] args)
{
new DownloadManager().show();
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -