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

📄 xdowntable.java

📁 仿迅雷下载器,http下载,多线程.多任务
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package cn.xl;

import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;


/**
 *用于显示下载任务的表格.
 *
 */
public class XDownTable
{
	private static final long serialVersionUID = 2621790669412858341L;
	private JTable downTable;
	
	/**
	 * 行索引.
	 */
	private static int rowIndex=0;
	

	/**
	 * 构造一张表,用于显示下载任务运行状态.
	 * @return
	 */
	public JTable xDownTable() 
	{
		//得到表.
		downTable=new XDownTable().createJTable(this.getVector(),1);
	
		//表可以被改变宽度,但不能拖走.
		downTable.getTableHeader().setReorderingAllowed(false);
		
		//列的宽度控制.//525宽
		TableColumnModel tc=downTable.getColumnModel();
		
		tc.getColumn(0).setPreferredWidth(50);
		tc.getColumn(0).setMinWidth(30);
		tc.getColumn(1).setPreferredWidth(210);
		tc.getColumn(1).setMinWidth(120);
		tc.getColumn(2).setPreferredWidth(70);
		tc.getColumn(2).setMinWidth(30);
		tc.getColumn(3).setMinWidth(30);
		tc.getColumn(4).setMinWidth(50);
		tc.getColumn(5).setMinWidth(50);
		tc.getColumn(6).setPreferredWidth(80);
		tc.getColumn(6).setMinWidth(60);
		
		
		
		//鼠标事件.
		downTable.addMouseListener(new MouseAdapter()
		{
			//行内双击事件.
			public void mouseClicked(MouseEvent e)
			{
				if(e.getButton()==3) return;//过滤右键
				if(e.getClickCount()==2)//得到鼠标双击事件.
				{
					//得到被选择的行.
					if(rowIndex>=SaveRunTime.getLIST().size())
					{
						System.out.println("点到了空白行.");
						return;
					}
					else
					{	//得到线程锁.
						DownLoad downLoad=(DownLoad)SaveRunTime.getLIST().get(rowIndex);
						//如果线程正在进行.则让其进入等待状态.
						if(downLoad.getDownLoadSign()==1)
						{	
							//暂停按钮被禁用.
							SaveRunTime.getPAUSE().setEnabled(false);
							downLoad.setDownLoadSign(0);//通知线程暂停.
							//不在下载线程中设置图标.
							downTable.setValueAt(new XDownTable().getImageIcon("/image/dpause.png"), rowIndex, 0);
						}
						//否则进入暂停.
						else if(downLoad.getDownLoadSign()==0)
						{	
							synchronized(downLoad)
							{
								downLoad.notify();
								SaveRunTime.getPAUSE().setEnabled(true);
								downTable.setValueAt(new XDownTable().getImageIcon("/image/ing.png"), rowIndex, 0);
								//线程被唤醒后会设置自己的开关变量.
							}
						}
						//否则重新启动一个线程.一个异常中断的线程,或是一个历史任务.
						else if(downLoad.getDownLoadSign()==-1||downLoad.getDownLoadSign()==-3)	
						{
							//得到文件路径与文件名.
							String saveAs=downLoad.getDownLoadFileName();
							String choos=downLoad.getDownLoadFileDirectory();
							String url=downLoad.getURL(downLoad);//得到链接路径.
							
							//得到断点.
							long point=new XDownTable().TestFile(choos+saveAs);
							//重新启动一个测试线程.
							new Thread(new TestLink(downLoad.row,url,choos,saveAs,point)).start();
						}
						
					}
				}
			}
		
			//行内右击事件.只在已经存在任务的行内有效.
			public void mousePressed(MouseEvent ex)
			{
				if(ex.getButton()==1)//过滤左键.
				return;
				
				Point point=new Point(ex.getX(),ex.getY());	//获得坐标点,
				final int row=downTable.rowAtPoint(point);	//根据坐标点获得行的索引.	
				
				
				downTable.requestFocus();//行获得焦点.
				downTable.setRowSelectionInterval(0, row);
				
				JPopupMenu jpop=new JPopupMenu();		 //准备弹出一个右键菜单.
				JMenuItem start=new JMenuItem("开始");
				
				JMenuItem newTask=new JMenuItem("新建");
				newTask.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						SaveRunTime.getNEWTASK_JDIALOG().setVisible(true);
					}
				});
				
				
				JMenuItem del=new JMenuItem("删除");
				
				//删除按钮单击事件.
				del.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						//删除一个任务需要,删除这一行所对应的下载线程锁,计时线程锁.
						DownLoad downLoad=(DownLoad)(SaveRunTime.getLIST().get(row));
						
						//如果此线程正在运行.
						if(downLoad.getDownLoadSign()==1)
						{
							downLoad.setDownLoadSign(-2);//下载线程调用删除.
						}
						else//线程处于睡眠或中断状态时.直接删除.
						{
							try
							{
								downLoad.taskEnd(row);
								new XmlOperation().writerTaskInfo();//写xml.
							} catch (Exception ex)
							{
								ex.printStackTrace();
							}
						}
					}
				});
				
				
				//开始按钮单击事件.(未完成)
				start.addActionListener(new ActionListener()
				{
					//判断线程的运行状态.
					public void actionPerformed(ActionEvent e)
					{	//得到给定行的线程对象.
						DownLoad downLoad=(DownLoad)(SaveRunTime.getLIST().get(row));
						int sign=downLoad.getDownLoadSign();//线程状态.
						if(sign==-1)//线程异常终止状态.重新启动一个线程.
						{
							//得到文件路径
							String saveAs=downLoad.getDownLoadFileName();
							String choos=downLoad.getDownLoadFileDirectory();
							String url=downLoad.getURL(downLoad);//得到链接路径.
							//得到断点.
							long point=new XDownTable().TestFile(choos+saveAs);
							
							//重新启动一个测试线程.
							new Thread(new TestLink(downLoad.row,url,choos,saveAs,point)).start();
						}
					}
				});
				jpop.setPopupSize(60, 80); 
				jpop.add(start);
				jpop.addSeparator();
				jpop.add(newTask);
				jpop.addSeparator();
				jpop.add(del);
											//菜单弹出坐标点.
				jpop.setLocation(ex.getX()+166,ex.getY()+180);
				jpop.setVisible(true);
				
			}	
		});
		
		
		
		
		
		
		//监听器,当选择列时调用.用于显示任务信息.
		DefaultListSelectionModel  listSM=(DefaultListSelectionModel)downTable.getSelectionModel();
		listSM.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
		listSM.addListSelectionListener(new ListSelectionListener()
		{
			public void valueChanged(ListSelectionEvent e)
			{
				//源.
				ListSelectionModel lm=(ListSelectionModel)e.getSource();
				
				if(e.getValueIsAdjusting())
				{
					//过滤一次响应.
					return;
				}
				//得到被选择的行.
				rowIndex=lm.getLeadSelectionIndex();
				rowIndex=lm.getLeadSelectionIndex();
				if(rowIndex>SaveRunTime.getSAVE_HASHMAP().size()-1)
				{//如果选到空白行,直接返回.
					return;
				}
				
				HashMap hm=SaveRunTime.getSAVE_HASHMAP().get(rowIndex);
				JTable xdit=SaveRunTime.getDOWN_INFOTABLE();
				xdit.setValueAt("正在获取链接...",0,0);	
				xdit.setValueAt("",0,1);
				xdit.setValueAt("文件名称",1,0);
				xdit.setValueAt(hm.get("文件名称"),1,1);
				xdit.setValueAt("文件长度",2,0);
				xdit.setValueAt(hm.get("文件长度"),2,1);
				xdit.setValueAt("文件类型",3,0);
				xdit.setValueAt(hm.get("文件类型"),3,1);
				xdit.setValueAt("保存路径",4,0);
				xdit.setValueAt(hm.get("保存路径"),4,1);
				xdit.setValueAt("链接地址",5,0);
				xdit.setValueAt(hm.get("链接地址"),5,1);
				xdit.setValueAt("对方主机",6,0);
				xdit.setValueAt(hm.get("对方主机"),6,1);
				return;
			}
		});
		
		 //网格颜色.
		downTable.setGridColor(new Color(226, 238, 249));
		
		//表头.
		JTableHeader downTableHeader= downTable.getTableHeader();
		
		//表头有下边框
		downTableHeader.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.gray));
		
		//构造单元格的渲染器.
		DefaultTableCellRenderer dtc=new DefaultTableCellRenderer();
		
		//设置背景色与容器背景色一致.
		dtc.setBackground(new Color(226, 238, 249));
		//将表头设置成此渲染器.
		downTableHeader.setDefaultRenderer(dtc);
		//保存对象.
		SaveRunTime.setDOWN_TABLE(downTable);
		return downTable;
	}
	
	
	/**
	 * 返回一个设置完成的JScrollPane
	 * @param table
	 * @return
	 */
	public JScrollPane getJScrollPane(JTable table)
	{
		JScrollPane jScrollTable = new JScrollPane();
		//滚动容器的基本设置
		jScrollTable.setBackground(new java.awt.Color(255, 255, 255));
        jScrollTable.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollTable.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        //滚动条没有边框.
        jScrollTable.setBorder(BorderFactory.createEmptyBorder());
		//表格所在的滚动容器背景色.
		jScrollTable.setBackground(new Color(226, 238, 249));
		//载入表格.
		jScrollTable.setViewportView(table);
		
		//抛出滚动容器.
		return jScrollTable;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -