⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 downloadmanager.java

📁 1.代码全由java书写 2.支持http1.1的可续传下载 3.GUI采用的是Java Swing 4.设计模式为Observer 5.采用了多线程机制
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        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 + -