`
chenyu.hz
  • 浏览: 139644 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

java仿迅雷下载

 
阅读更多

 

 

package org.crazyit.flashget.ui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.Timer;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import org.crazyit.flashget.ContextHolder;
import org.crazyit.flashget.DownloadContext;
import org.crazyit.flashget.info.Info;
import org.crazyit.flashget.navigation.DownloadNode;
import org.crazyit.flashget.navigation.DownloadingNode;
import org.crazyit.flashget.navigation.FailNode;
import org.crazyit.flashget.navigation.FinishNode;
import org.crazyit.flashget.navigation.TaskNode;
import org.crazyit.flashget.object.Resource;
import org.crazyit.flashget.state.Downloading;
import org.crazyit.flashget.state.Failed;
import org.crazyit.flashget.state.Finished;
import org.crazyit.flashget.state.Pause;
import org.crazyit.flashget.util.DateUtil;
import org.crazyit.flashget.util.FileUtil;
import org.crazyit.flashget.util.ImageUtil;

public class MainFrame extends JFrame {

	//导航树
	private NavigationTree navTree;
	//下载列表
	private DownloadTable downloadTable;
	//信息列表
	private JList infoJList;
	//工具栏
	private JToolBar toolBar = new JToolBar();
	//新任务界面
	private NewTaskFrame taskFrame;
	//所有任务节点
	private TaskNode taskNode = new TaskNode();
	//正在下载节点
	private DownloadingNode downloadingNode = new DownloadingNode();
	//下载失败节点
	private FailNode failNode = new FailNode();
	//下载完成节点
	private FinishNode finishNode = new FinishNode();
	//当前用户浏览的节点
	private DownloadNode currentNode = taskNode;
	
	//信息列表的对象
	private final static String FILE_SIZE_TEXT = "文件大小: ";
	private final static String FILE_PATH_TEXT = "文件路径: ";
	private final static String DOWNLOAD_DATE_TEXT = "下载时间: ";
	private final static String RESOURCE_INFO_TEXT = "资源信息: ";
	private List<Info> infoList = new ArrayList<Info>();
	private Info fileSize = new Info(FILE_SIZE_TEXT);
	private Info filePath = new Info(FILE_PATH_TEXT);
	private Info downloadDate = new Info(DOWNLOAD_DATE_TEXT);
	private Info info = new Info(RESOURCE_INFO_TEXT);
	
	private Action newTask = new AbstractAction("新任务", new ImageIcon("images/tool/new-download.gif")) {
		public void actionPerformed(ActionEvent e) {
			newTask();
		}
	};
	
	private Action start = new AbstractAction("开始", new ImageIcon("images/tool/do-download.gif")) {
		public void actionPerformed(ActionEvent e) {
			start();
		}
	};
	
	private Action pause = new AbstractAction("暂停", new ImageIcon("images/tool/pause.gif")) {
		public void actionPerformed(ActionEvent e) {
			pause();
		}
	};
	
	private Action delete = new AbstractAction("删除任务", new ImageIcon("images/tool/delete.gif")) {
		public void actionPerformed(ActionEvent e) {
			delete();
		}
	};
	
	private Action deleteFinished = new AbstractAction("删除任务", new ImageIcon("images/tool/remove-finished.gif")) {
		public void actionPerformed(ActionEvent e) {
			deleteFinished();
		}
	};
	
	ActionListener refreshTable = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			//刷新列表
			downloadTable.updateUI();
		}
	};

	//悬浮窗口
	private SuspendWindow suspendWindow;
	//任务栏图标
	private TrayIcon trayIcon;
	//任务栏图标菜单
	private PopupMenu popupMenu = new PopupMenu();
	private MenuItem openItem = new MenuItem("打开/关闭");
	private MenuItem newItem = new MenuItem("新建下载任务");
	private MenuItem startItem = new MenuItem("开始全部任务");
	private MenuItem pauseItem = new MenuItem("暂停全部任务");
	private MenuItem removeItem = new MenuItem("删除完成任务");
	private MenuItem quitItem = new MenuItem("退出");
	
	private BufferedImage trayIconImage = ImageUtil.getImage(ImageUtil.TRAY_ICON_PATH);
	
	public MainFrame() {
		//创建导航树
		createTree();
		createDownloadTable();
		//创建信息列表
		createList();
		this.taskFrame = new NewTaskFrame();
		//创建悬浮窗口
		this.suspendWindow = new SuspendWindow(this);
		//创建任务栏图标
		createTrayIcon();
		//创建工具栏
		createToolBar();
		//得到屏幕大小
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		//导航滚动
		JScrollPane navPane = new JScrollPane(this.navTree);
		JScrollPane downloadPane = new JScrollPane(this.downloadTable);
		int downloadPaneHeight = (int)(screen.height/1.5);
		int downloadPaneWidth = (int)(screen.width/0.8);
		downloadPane.setPreferredSize(new Dimension(downloadPaneWidth, downloadPaneHeight));
		JScrollPane infoPane = new JScrollPane(this.infoJList);
		//主界面右边的分隔Pane
		JSplitPane rightPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
				downloadPane, infoPane);
		rightPane.setDividerLocation(500);
		rightPane.setDividerSize(3);
		//主界面的分隔Pane
		JSplitPane mainPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
				navPane, rightPane);
		mainPane.setDividerSize(3);
		mainPane.setDividerLocation((int)(screen.width/5.5));
		
		this.add(mainPane);
		this.setPreferredSize(new Dimension(screen.width, screen.height - 30));
		this.setVisible(true);
		this.setTitle("下载工具");
		this.pack();
		initlisteners();
		//创建定时器
		Timer timer = new Timer(1000, refreshTable);
		timer.start();
		//读取序列化文件
		reverseSer();
	}
	
	public NewTaskFrame getNewTaskFrame() {
		return this.taskFrame;
	}
	
	/**
	 * 创建任务栏图标
	 */
	private void createTrayIcon() {
		this.popupMenu.add(openItem);
		this.popupMenu.add(newItem);
		this.popupMenu.add(startItem);
		this.popupMenu.add(pauseItem);
		this.popupMenu.add(removeItem);
		this.popupMenu.add(quitItem);
		try {
			SystemTray tray = SystemTray.getSystemTray();
			this.trayIcon = new TrayIcon(trayIconImage, "多线程下载工具", this.popupMenu);
			this.trayIcon.setToolTip("多线程下载工具");
			tray.add(this.trayIcon);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void initlisteners() {
		//点击列表鼠标监听器
		this.downloadTable.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				//得到点击的资源
				Resource r = getResource();
				if (r == null) return;
				//设置信息显示区域的值
				fileSize.setValue(FILE_SIZE_TEXT + r.getSize());
				filePath.setValue(FILE_PATH_TEXT + 
						r.getSaveFile().getAbsolutePath());
				downloadDate.setValue(DOWNLOAD_DATE_TEXT + 
						DateUtil.formatDate(r.getDownloadDate()));
				info.setValue(RESOURCE_INFO_TEXT + r.getState().getState());
				//重新设置JList数据
				infoJList.setListData(infoList.toArray());
			}
		});
		//点击导航树鼠标监听器
		this.navTree.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e) {
				selectTree();
			}
		});
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				setVisible(false);
			}
		});
		//任务栏图标监听器
		this.trayIcon.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					setVisible(true);
				}
			}
		});
		this.openItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (isVisible()) setVisible(false);
				else setVisible(true);
			}
		});
		this.newItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				taskFrame.setVisible(true);
			}
		});
		this.startItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				startAllTask();
			}
		});
		this.pauseItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				pauseAllTask();
			}
		});
		this.removeItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				deleteFinished();
			}
		});
		this.quitItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				serializable();
				System.exit(0);
			}
		});
	}
	
	/**
	 * 点击导航树触发的方法
	 */
	private void selectTree() {
		DownloadNode selectNode = getSelectNode();
		this.currentNode = selectNode;
		refreshTable();
	}
	
	/**
	 * 刷新列表
	 */
	private void refreshTable() {
		DownloadTableModel model = (DownloadTableModel)this.downloadTable.getModel();
		model.setResources(ContextHolder.ctx.getResources(currentNode));
	}
	
	private DownloadNode getSelectNode() {
		TreePath treePath = this.navTree.getSelectionPath();
		if (treePath == null) return null;
		//获得选中的TreeNode
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)treePath.getLastPathComponent();
		return (DownloadNode)node.getUserObject();
	}
	
	private void addTableData() {
		DownloadTableModel model = (DownloadTableModel)this.downloadTable.getModel();
		//将保存的资源设置到列表中
		model.setResources(ContextHolder.ctx.resources);
		//刷新列表
		this.downloadTable.refresh();
	}
	
	/**
	 * 反序列化
	 */
	public void reverseSer() {
		File serFile = FileUtil.SERIALIZABLE_FILE;
		if (!serFile.exists()) return;
		try {
			//得到文件输入流
			FileInputStream fis = new FileInputStream(serFile);
			ObjectInputStream ois = new ObjectInputStream(fis);
			//设置ContextHolder的DownloadContext
			ContextHolder.ctx = (DownloadContext)ois.readObject();
			ois.close();
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//设置列表
		addTableData();
	}
	
	/**
	 * 序列化(DownloadContext对象)
	 */
	public void serializable() {
		try {
			//序列化前先将所有正在下载的任务停止
			for (Resource r : ContextHolder.ctx.resources) {
				if (r.getState() instanceof Downloading) {
					r.setState(ContextHolder.ctx.PAUSE);
				}
			}
			File serFile = FileUtil.SERIALIZABLE_FILE;
			//判断序列化文件是否存在, 不存在则创建
			if (!serFile.exists()) serFile.createNewFile();
			FileOutputStream fos = new FileOutputStream(serFile);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			//将上下文对象写到序列化文件中
			oos.writeObject(ContextHolder.ctx);
			oos.close();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public JTable getDownloadTable() {
		return this.downloadTable;
	}
	
	private void createDownloadTable() {
		DownloadTableModel tableModel = new DownloadTableModel();
		this.downloadTable = new DownloadTable();
		this.downloadTable.setModel(tableModel);
		this.downloadTable.setTableFace();
	}

	private void createToolBar() {
		this.toolBar.setFloatable(false);
		this.toolBar.add(this.newTask).setToolTipText("新下载任务");
		this.toolBar.add(this.start).setToolTipText("开始任务");
		this.toolBar.add(this.pause).setToolTipText("暂停");
		this.toolBar.add(this.delete).setToolTipText("删除");
		this.toolBar.add(this.deleteFinished).setToolTipText("移除已经完成的任务");
		this.toolBar.setMargin(new Insets(5, 10, 5, 5));
		this.add(this.toolBar, BorderLayout.NORTH);
	}
	
	private void start() {
		Resource r = getResource();
		if (r == null) return;
		if (r.getState() instanceof Pause || r.getState() instanceof Failed) {
			ContextHolder.dh.resumeDownload(r);
		}
	}
	
	/**
	 * 开始全部任务
	 */
	public void startAllTask() {
		for (Resource r : ContextHolder.ctx.resources) {
			if (r.getState() instanceof Pause || r.getState() instanceof Failed) {
				ContextHolder.dh.resumeDownload(r);
			}
		}
	}
	
	/**
	 * 暂停全部任务
	 */
	public void pauseAllTask() {
		for (Resource r : ContextHolder.ctx.resources) {
			if (r.getState() instanceof Downloading) {
				r.setState(ContextHolder.ctx.PAUSE);
			}
		}
	}
	
	private void newTask() {
		this.taskFrame.setVisible(true);
	}
	
	private void pause() {
		Resource r = getResource();
		if (r == null) return;
		//判断状态
		if (!(r.getState() instanceof Downloading)) return;
		r.setState(ContextHolder.ctx.PAUSE);
	}
	
	/**
	 * 删除资源
	 */
	private void delete() {
		Resource r = getResource();
		if (r == null) return;
		//先将任务停止
		r.setState(ContextHolder.ctx.PAUSE);
		//删除所有的.part文件
		FileUtil.deletePartFiles(r);
		//从上下文集合中删除资源
		ContextHolder.ctx.resources.remove(r);
	}
	
	/**
	 * 删除已下载完成的资源
	 */
	public void deleteFinished() {
		for (Iterator it = ContextHolder.ctx.resources.iterator(); it.hasNext();) {
			Resource r = (Resource)it.next();
			if (r.getState() instanceof Finished) {
				it.remove();
			}
		}
	}
	
	/**
	 * 得到用户在列表中所选择的资源
	 * @return
	 */
	private Resource getResource() {
		int row = this.downloadTable.getSelectedRow();
		int column = this.downloadTable.getColumn(DownloadTableModel.ID_COLUMN).getModelIndex();
		if (row == -1) return null;
		String id = (String)this.downloadTable.getValueAt(row, column);
		return ContextHolder.ctx.getResource(id);
	}

	
	/**
	 * 创建树
	 */
	private void createTree() {
		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
		DefaultMutableTreeNode tn = new DefaultMutableTreeNode(taskNode);
		root.add(tn);
		//创建各个节点
		tn.add(new DefaultMutableTreeNode(downloadingNode));
		tn.add(new DefaultMutableTreeNode(failNode));
		tn.add(new DefaultMutableTreeNode(finishNode));
		this.navTree = new NavigationTree(root);
	}
		
	private void createList() {
		this.infoJList = new JList();
		this.infoList.add(this.fileSize);
		this.infoList.add(this.filePath);
		this.infoList.add(this.downloadDate);
		this.infoList.add(this.info);
		this.infoJList.setListData(infoList.toArray());
	}
	
	
}

 

  • 大小: 21.4 KB
分享到:
评论
5 楼 每天一首喜欢的歌 2018-01-11  
这是用什么软件做的
4 楼 ma546659141 2017-08-30  
厉害
3 楼 shreo_2007 2015-11-16  
完美运行.很强大.很好的学习资源
2 楼 盖世英雄_1988 2015-05-12  
我去,楼主你为什么这么吊,太强大了。。支持楼主,顶顶顶顶。。。。。
1 楼 WLLT 2012-05-19  
niu  顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java 仿迅雷下载

    总的来说,Java仿迅雷下载涉及到多线程编程、文件操作、网络通信、异常处理等多个方面,对提升Java程序员的实际开发技能有显著帮助。通过对这个项目的实践,开发者可以更好地理解和掌握这些关键技能,并能够应用到...

    java 仿迅雷下载器源文件

    本项目"java 仿迅雷下载器源文件"旨在模仿迅雷下载器的功能,利用Java语言实现了一个多线程的下载工具。下面将详细探讨这个项目中涉及的核心知识点。 1. **多线程**: - **线程创建**:Java中的`Thread`类或者`...

    纯java代码实现的迅雷功能

    在IT行业中,模仿迅雷实现网页资源下载的功能是一项常见的需求,尤其对于Java开发者而言,能够用纯Java代码来实现这样的功能不仅可以提升技能,还能更好地理解网络编程和多线程技术。下面,我们将深入探讨如何使用...

    java仿迅雷多线程下载工具源码

    Java仿迅雷多线程下载工具的实现涉及到了断点续传技术和HTTP及FTP协议的运用,这两种协议在文件传输中扮演着重要角色。断点续传技术允许在下载或上传过程中因网络中断而从上次停止的地方继续,极大地提高了效率和...

    仿迅雷下载器

    【仿迅雷下载器】是一种基于编程实现的下载工具,其设计灵感来源于知名的下载软件——迅雷。通过分析迅雷的下载机制,开发者可以构建一个类似的下载管理器,以提供快速、稳定且高效的文件下载服务。这篇博客文章...

    毕业设计多线程下载工具java实现

    【标题】"毕业设计多线程下载工具java实现"是一个基于Java编程语言开发的软件项目,旨在实现一个高效、实用的文件下载工具。这个工具利用了多线程技术,能够提高下载速度,优化用户下载体验。 【核心知识点】: 1....

    java仿造迅雷

    在Java编程领域,"java 仿造迅雷" 指的是使用Java语言来实现一个类似迅雷下载工具的功能。迅雷是一款著名的多线程、断点续传的下载软件,其核心特性包括高效的文件分块下载、网络连接管理、多源下载以及智能调度等。...

    仿迅雷下载器(JAVA版)

    【仿迅雷下载器(JAVA版)】是一个基于JAVA编程语言开发的简易下载工具,它的主要目的是模拟迅雷下载器的核心功能,即提供文件的网络下载服务。虽然这个项目目前的功能相对基础,但它为学习和理解JAVA编程以及网络...

    仿迅雷多线程下载

    【正文】 ...通过研究和实践这个"仿迅雷多线程下载"项目,初学者不仅可以掌握Java的多线程编程,还能深入理解网络编程和文件操作,这对于提升软件开发能力,尤其是构建高性能的下载应用非常有帮助。

    仿迅雷的下载工具

    6. **用户界面**:为了方便用户操作,仿迅雷下载工具应有一个简洁易用的用户界面,可能包括任务列表、下载速度显示、设置选项等。这涉及到GUI编程,如Java的Swing或JavaFX,或者是Python的Tkinter库。 7. **网络...

    仿迅雷的电影视频门户程序源码

    仿迅雷的电影视频门户程序源码

    Jsp 仿迅雷论坛(非常详细:数据库设计+PPT+需求分析+页面注释)

    在IT行业中,构建一个论坛系统是一项常见的实践项目,本项目以“仿迅雷论坛”为例,详细涵盖了从需求分析、数据库设计、页面开发到功能实现的全过程。这是一个基于JSP(JavaServer Pages)技术的论坛系统,融合了SQL...

    odm开源(仿迅雷源码)

    ODM开源项目,全称为Open Download Manager,是一个模仿迅雷下载管理器的开源软件。这个项目旨在提供一个类似迅雷的高效、稳定的多线程下载工具,让用户可以在互联网上自由地管理和控制自己的下载任务。迅雷作为国内...

    仿迅雷看看源码V4.0

    1. **Web开发框架**:仿迅雷看看源码很可能采用了某一种流行的Web开发框架,如PHP的Laravel或ThinkPHP,Java的Spring Boot,或者Python的Django等。这些框架能简化开发流程,提供丰富的功能库和结构模板,帮助开发者...

    商业编程-源码-仿迅雷博客弹出登录窗口.zip

    【标题】"商业编程-源码-仿迅雷博客弹出登录窗口.zip"指的是一个包含源代码的压缩文件,该源代码是用于创建一个模仿迅雷博客登录窗口的应用程序。迅雷博客是一款知名的网络服务,而这个项目可能是为了在其他业务环境...

    仿迅雷看看渐变按钮

    在本话题中,我们将深入探讨如何实现“仿迅雷看看”的渐变按钮效果。 迅雷看看是一款知名的在线视频播放软件,其用户界面设计简洁而富有现代感。其中,渐变按钮作为用户与应用交互的关键部分,它的设计通常包含以下...

    JAVA 范例大全 光盘 资源

    实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 模仿QQ空间的电子相册 409 实例140 会动的七彩文字 413 实例141 模仿3D渐层效果 416 实例142 模仿...

    迅雷导航条的模仿.rar

    迅雷是中国知名的互联网下载工具,以其高速下载技术闻名,其内置的导航条通常包含多种网络服务入口,如搜索引擎、热门网站链接等。 【描述】:“超强的模仿迅雷导航条的应用。超震撼哦。很好啊。”这句话暗示这个...

    MATLAB2017b.rar

    MATLAB2017b是一款强大的数学计算软件,由美国MathWorks公司开发,广泛应用于工程计算、数据分析、算法...通过迅雷下载链接获取MATLAB2017b,可以避免因百度云限速带来的困扰,更快地安装并开始使用这款强大的工具。

    TTKDownloader-master.zip

    至于"仿迅雷界面"的标签,这表明TTKDownloader的界面设计风格与流行的迅雷下载工具相似。这意味着它可能采用了类似的布局、颜色方案和图标,以提供用户熟悉的用户体验。在编程实现上,这可能涉及到UI库的使用,如Qt...

Global site tag (gtag.js) - Google Analytics