📄 downloadmanager.java
字号:
StatusRenderer renderer2 = new StatusRenderer();
table.setDefaultRenderer(JLabel.class,renderer2);
//将table的行高设得足够大以匹配JProgressBar
table.setRowHeight(
(int) renderer.getPreferredSize().getHeight());
//设置下载Panel
JPanel downloadsPanel = new JPanel();
downloadsPanel.setBackground(backColor);
downloadsPanel.setLocation(panelx, panely2);
downloadsPanel.setSize(panelw, panelh2);
downloadsPanel.setBorder(
BorderFactory.createTitledBorder("下载任务列表"));
downloadsPanel.setLayout(new BorderLayout());
downloadsPanel.add(new JScrollPane(table),
BorderLayout.CENTER);
//设置页面的第三个部分--操纵按钮组
JPanel buttonsPanel = new JPanel();
buttonsPanel.setBackground(backColor);
buttonsPanel.setLocation(panelx, panely3);
buttonsPanel.setSize(panelw, panelh3);
pauseButton = new JButton("暂停");
pauseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionPause();
}
});
pauseButton.setEnabled(false);
buttonsPanel.add(pauseButton);
resumeButton = new JButton("恢复");
resumeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionResume();
}
});
resumeButton.setEnabled(false);
buttonsPanel.add(resumeButton);
cancelButton = new JButton("取消");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCancel();
}
});
cancelButton.setEnabled(false);
buttonsPanel.add(cancelButton);
clearButton = new JButton("删除");
clearButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionClear();
}
});
clearButton.setEnabled(false);
buttonsPanel.add(clearButton);
//将页面的三大部分添加进窗体中
getContentPane().add(addPanel);
getContentPane().add(downloadsPanel);
getContentPane().add(buttonsPanel);
}
//退出程序
private void actionExit() {
System.exit(0);
}
// 实现添加新的下载任务
private void actionAdd() {
//首先检测url是否有效,无效则提示用户并返回
URL verifiedUrl = verifyUrl(addTextField.getText());
if (verifiedUrl == null)
{
JOptionPane.showMessageDialog(this,
"下载地址无效", "Error",
JOptionPane.ERROR_MESSAGE);
addTextField.requestFocus();
return;
}
//然后检测下载目录是否已经选定,如果没有选定,提示用户并返回
String dir = saveDirTextField.getText();
if ( dir == "")
{
JOptionPane.showMessageDialog(this,
"请选择文件的存储目录:", "Error",
JOptionPane.ERROR_MESSAGE);
saveDirTextField.requestFocus();
return;
}
//最后检测另存名称是否为空,如果为空,提示用户并返回
String fileName = saveNameTextField.getText();
if ( fileName == "")
{
JOptionPane.showMessageDialog(this,
"文件另存名称不能为空", "Error",
JOptionPane.ERROR_MESSAGE);
saveNameTextField.requestFocus();
return;
}
//添加下载任务
tableModel.addDownload(new Download(verifiedUrl, dir, fileName));
//清空文本框以进行新的下载
addTextField.setText("");
saveNameTextField.setText("");
}
//处理选择目录按钮单击事件
//chooseDirButton被单击时,弹出选择目录对话框,
//让用户选择文件的存储路径,并将用户选择更新到saveDirTextField
private void actionChooseSaveDir() {
JFileChooser fileChooser = null;
fileChooser = new JFileChooser("C:\\");
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.showOpenDialog(this);
String folder = fileChooser.getSelectedFile().getAbsolutePath();
saveDirTextField.setText(folder);
}
//工具函数实现从一个Url中提取出文件名的功能
private String getFileName(URL url) {
String fileName = url.getFile();
return fileName.substring(fileName.lastIndexOf('/') + 1);
}
//验证url字符串,如果合法则返回一个Url对象,否则返回null
private URL verifyUrl(String url) {
// 只允许Http协议Url
if (!url.toLowerCase().startsWith("http://")) {
return null;
}
// 验证url的格式
URL verifiedUrl = null;
try {
verifiedUrl = new URL(url);
} catch (Exception e) {
return null;
}
// 确定url对应一个文件
if (verifiedUrl.getFile().length() < 2) {
return null;
}
return verifiedUrl;
}
//当选中的表格的行改变时被调用
private void tableSelectionChanged() {
//让本类不再接收上次选中download的更新信息
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: // COMPLETE or CANCELLED
pauseButton.setEnabled(false);
resumeButton.setEnabled(false);
cancelButton.setEnabled(false);
clearButton.setEnabled(true);
}
} else {
// 没有下载任务被选中
pauseButton.setEnabled(false);
resumeButton.setEnabled(false);
cancelButton.setEnabled(false);
clearButton.setEnabled(false);
}
}
/* 当一个Download通知它的观察者有自己有改变时update()被调用 */
public void update(Observable o, Object arg) {
//当选中下载任务的状态发生改变时更新buttons的可见性
if (selectedDownload != null && selectedDownload.equals(o)) {
updateButtons();
}
}
// 运行下载管理器
public static void main(String[] args) {
DownloadManager manager = new DownloadManager();
manager.show();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -