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

📄 jtableprogress.java

📁 基于图形化的多线程下载器
💻 JAVA
字号:


/*
 *question:表格中进度条显示,及值的设置
 *		
 *		
 */

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;

import javax.swing.*;
import javax.swing.table.*;

import java.util.*;

public class JTableProgress extends JFrame {
	private static final int DEFAULT_WIDTH = 400;
	private static final int DEFAULT_HEIGHT = 400;
	private static final int DEFAULT_LEFT = 300;
	private static final int DEFAULT_TOP = 300;

	private ArrayList<TaskInfo> taskInfoList = null;
	private ArrayList<MainTaskThread> taskThreadList = null;
	private Vector downlist;
	private JFrame jf;
	private JTable jt;
	private static MyDefaultTableModel model;
	TextField taURL = null;
	TextField taDstFile = null;
	TextField taNum = null;

	public JTableProgress() {
		taskInfoList = new ArrayList<TaskInfo>();
		taskThreadList = new ArrayList<MainTaskThread>();

		downlist = new Vector();
		jf = new JFrame("java下载器 0.2 Alpha");
		jf.setSize(new Dimension(600, 320));
		jf.setLocation(100, 100);

		model = new MyDefaultTableModel();

		jt = new JTable(model);
		jt.setRowHeight(20);
		TableColumn tableColumn = jt.getColumnModel().getColumn(3);
		JTableCellRenderer renderer = new JTableCellRenderer();
		renderer.setForeground(Color.LIGHT_GRAY);
		tableColumn.setCellRenderer(renderer);
		jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		jf.getContentPane().add(new JScrollPane(jt), BorderLayout.CENTER);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// ///

		JPanel newTask = new JPanel();
		taURL = new TextField("URL                ");
		taDstFile = new TextField("Destination       ");
		taNum = new TextField("Thread Number");
		newTask.add(taURL);
		newTask.add(taDstFile);
		newTask.add(taNum);
		jf.add(newTask, BorderLayout.NORTH);

		// //按钮显示
		String buttonStr[] = { "添加任务", "删除任务", "开始", "停止" };

		JPanel cmdButtonPanel = new JPanel();
		for (int i = 0; i < buttonStr.length; i++) {
			JButton button = new JButton(buttonStr[i]);
			button.addActionListener(new ButtonAction());
			cmdButtonPanel.add(button);
		}

		jf.getContentPane().add(cmdButtonPanel, BorderLayout.SOUTH);

	}

	private boolean loadTaskFile() {
		ObjectInputStream ois = null;
		FileInputStream fis = null;
		TaskInfo ti = null;
		try {
			fis = new FileInputStream("d:\tasklist.txt");
			ois = new ObjectInputStream(fis);
			while ((ti = (TaskInfo) ois.readObject()) != null) {
				ti.setStartTime(System.currentTimeMillis());
				taskInfoList.add(ti);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {

		}
	}

	private boolean saveTaskFile() {
		ObjectOutputStream oos = null;
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("d:\tasklist.txt");
			oos = new ObjectOutputStream(fos);
			Iterator it = taskInfoList.iterator();
			while (it.hasNext() && !taskInfoList.isEmpty()) {
				TaskInfo ti = (TaskInfo) it.next();
				oos.writeObject(ti);
			}
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	public static void main(String[] args) {
		JTableProgress t = new JTableProgress();
		t.testTask();
	}

	public void testTask() {

		// addATask("http://localhost/study/jdk150.chm", "d:/3.chm", 2);
		//

// addATask("http://www.yesfox.com/index.files/yesfox.mp3 ", "d:/ccc.mp3",
// 4);

		
		AddTask task1 = new AddTask("http://www.yesfox.com/index.files/yesfox.mp3 ", "d:/ccc.mp3",4);
		task1.setPriority(Thread.MAX_PRIORITY);
		task1.start();
		addATask("http://www.yhqsng.cn/uploadFiles/2007-08/1188280814699.mp3", "d:/b.mp3", 4);
		 
		// addATask(
		// "http://www.sdz.net.cn/homepage/student/030205/_private/number2.mp3
		// ",
		// "d:/祝福.mp3", 4);
		// TaskListThreadListObserver ttlo = new TaskListThreadListObserver(
		// taskInfoList);
		// ttlo.start();
		Progress pro = new Progress();
		pro.start();

	}

	class ButtonAction implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			int select = jt.getSelectedRow();

			System.out.println(select);
			if ("添加任务".equals(e.getActionCommand())) {
				AddTask at = new AddTask(taURL.getText(), taDstFile.getText(),
						Integer.parseInt(taNum.getText()));
				at.setPriority(Thread.MAX_PRIORITY);
				at.start();
			} else if ("删除任务".equals(e.getActionCommand())) {
				if (select < 0)
					return;
				taskInfoList.get(select).setState(TaskInfo.TASK_STATE_STOP);
				delATask(select);
				System.out.println("del!!!!");

			} else if ("开始".equals(e.getActionCommand())) {
				if (select < 0)
					return;
				// if task is running, ignor this action
				if (!(taskInfoList.get(select).getState() == TaskInfo.TASK_STATE_RUN))
					startATask(select);
			} else if ("停止".equals(e.getActionCommand())) {
				
				System.out.println(select);
				if (select < 0)
					return;
				stopATask(select);

			}
		}
	}

	class AddTask extends Thread {
		String url = null;
		String dstFile = null;
		int portionNumber = 0;

		public AddTask(String url, String dstFile, int portionNumber) {
			this.url = url;
			this.dstFile = dstFile;
			this.portionNumber = portionNumber;
		}

		public void run() {
			System.out.println("loading task thread start!");
			model.addRow("连接中...", dstFile, " Mb", new Point(0, 10), "kb/s");
			TaskInfo ti = null;
			if ((ti = TaskInfo.getInstance(url, dstFile, portionNumber)) == null) {
				System.out.println("task failed!");
				return;
			}
			taskInfoList.add(ti);
			MainTaskThread mtt = new MainTaskThread(ti);
			taskThreadList.add(mtt);
			mtt.start();
			ti.setStartTime(System.currentTimeMillis());
			ti.setState(TaskInfo.TASK_STATE_RUN);
			model.setValueAt((double) ti.getTotalLength() / 1000000 + " Mb",
					model.getRowCount() - 1, 2);

			jt.updateUI();
		}
	}

	public void addATask(String url, String dstFile, int portionNumber) {
		model.addRow("连接中...", dstFile, " Mb", new Point(0, 10), "kb/s");
		TaskInfo ti = null;
		if ((ti = TaskInfo.getInstance(url, dstFile, portionNumber)) == null) {
			System.out.println("task failed!");
			return;
		}
		taskInfoList.add(ti);
		MainTaskThread mtt = new MainTaskThread(ti);
		taskThreadList.add(mtt);
		mtt.start();
		ti.setStartTime(System.currentTimeMillis());
		ti.setState(TaskInfo.TASK_STATE_RUN);
		model.setValueAt((double) ti.getTotalLength() / 1000000 + " Mb", model
				.getRowCount() - 1, 2);

		jt.updateUI();
	}

	public void startATask(int i) {
		TaskInfo ti = taskInfoList.get(i);

		if (!(ti.getState() != TaskInfo.TASK_STATE_RUN))
			return;
		// Iterator it = taskThreadList.iterator();

		// check download thread already run
		// while (it.hasNext() && !taskThreadList.isEmpty()) {
		// MainTaskThread mtt = (MainTaskThread) it.next();
		// if (mtt.getTaskInfo() == ti) {
		// return;
		// }
		// }
		ti.setStartTime(System.currentTimeMillis());
		ti.setState(TaskInfo.TASK_STATE_RUN);
		MainTaskThread mtt = new MainTaskThread(ti);
		taskThreadList.add(mtt);
		mtt.start();
	}

	public void stopATask(int i) {
		taskInfoList.get(i).setState(TaskInfo.TASK_STATE_STOP);
		taskInfoList.get(i).setStartTime(0);
		taskInfoList.get(i).setLastPos();
		taskThreadList.remove(i);
	}

	public void delATask(int i) {
		taskInfoList.remove(i);
		model.removeRow(i);
		jt.updateUI();
	}

	class Progress extends Thread {
		public void run() {
			while (true) {
				MyUtil.sleepNow(1000);
				for (int i = 0; i < taskInfoList.size(); i++) {
					TaskInfo ti = taskInfoList.get(i);
					if (ti.finished())
						ti.setState(TaskInfo.TASK_STATE_FINISHED);
					switch (ti.getState()) {
					case TaskInfo.TASK_STATE_FINISHED:
						model.setValueAt("下载完成", i, 0);
						model.setValueAt("", i, 4);
						model.setValueAt(new Point(10, 10), i, 3);
						break;
					case TaskInfo.TASK_STATE_PAUSE:
						model.setValueAt("任务暂停", i, 0);
						break;
					case TaskInfo.TASK_STATE_RUN:
						System.out.println(ti + " : " + ti.getAcquiredSize());
						long duringTime = 1 + ((System.currentTimeMillis() - ti
								.getStartTime()) / 1000);
						// System.out.println(duringTime);
						long latestAcquiredSize = ti.getLatestAcquiredSize() / 1000;
						model.setValueAt("正在下载", i, 0);
						model.setValueAt(new Point(
								(int) ti.getAcquiredSize() / 1000, (int) ti
										.getTotalLength() / 1000), i, 3);
						// System.out.println(latestAcquiredSize/duringTime);
						model.setValueAt((latestAcquiredSize / duringTime)
								+ "kb/s", i, 4);

						break;
					case TaskInfo.TASK_STATE_STOP:
						model.setValueAt("任务停止", i, 0);
						model.setValueAt("kb/s", i, 4);
						break;
					} // switch
				} // for
			} // while
		}
	}
}

/*
 * 
 */
class MyDefaultTableModel extends AbstractTableModel {
	private Vector content = null;
	private String[] title_name = { "状态", "文件名", "文件大小", "进度", "速度" };

	public MyDefaultTableModel() {
		content = new Vector();
	}

	public MyDefaultTableModel(int count) {
		content = new Vector(count);
	}

	public MyDefaultTableModel(int a, int b) {
		content = new Vector(a);
		for (int i = 0; i < a; i++) {
			this.addRow("", "", "", new Point(0, 10), "");
		}
	}

	/*
	 * 新加入一行
	 */
	public void addRow(String state, String fname, String size, Point p,
			String speet) {
		Vector v = new Vector(6);
		v.add(state);
		v.add(fname);
		v.add(size);
		v.add(p);
		v.add(speet);
		content.add(v);
	}

	/*
	 * 删除一行
	 */
	public void removeRow(int row) {
		content.remove(row);
	}

	public void removeRows(int row, int count) {
		for (int i = 0; i < count; i++) {
			if (content.size() > row) {
				content.remove(row);
			}
		}
	}

	/**
	 * 使表格不可修改
	 */
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	/**
	 * 使修改的内容生效
	 */
	public void setValueAt(Object value, int row, int col) {
		((Vector) content.get(row)).remove(col);
		((Vector) content.get(row)).add(col, value);
		this.fireTableCellUpdated(row, col);
	}

	public String getColumnName(int col) {
		return title_name[col];
	}

	public int getColumnCount() {
		return title_name.length;
	}

	public int getRowCount() {
		return content.size();
	}

	public Object getValueAt(int row, int col) {
		return ((Vector) content.get(row)).get(col);
	}

	/*
	 * 根据所给name,得到name所在的行
	 */
	public int getNameRow(String name) {
		int index = -1;
		Enumeration enu = content.elements();
		while (enu.hasMoreElements()) {
			index++;
			Vector v = (Vector) enu.nextElement();
			if (name.equals(v.get(1))) {
				return index;

			}
		}
		return index;
	}

	/**
	 * 返回数据类型
	 */
	public Class getColumnClass(int columnIndex) {
		if (columnIndex == getColumnCount() - 3)
			return Point.class; // number pair
		return getValueAt(0, columnIndex).getClass();
	}
}

class JTableCellRenderer extends JProgressBar implements TableCellRenderer {

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		this.setStringPainted(true);
		final Point pair = (Point) value;
		setMinimum(0);
		setMaximum(pair.y);
		setValue(pair.x);

		if (isSelected)
			setBackground(table.getSelectionBackground());
		else
			setBackground(table.getBackground());
		return this;
	}
}

⌨️ 快捷键说明

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