关闭

java多线程下载工具(二)

917人阅读 评论(1) 收藏 举报

2、资源列表(JTable)的实现,

这是整个主界面的重点也是难点!!!我将尽可能的详细介绍,希望能够将清楚。

由于jTable中的每一列的数据(状态、进度、下载速度、已下载、已用时间、剩余时间)都是动态的,所以这里也需要设置渲染器,而且进度条的渲染器与其他列的不同。

 

首先设这进度条的渲染器:

/**
 * 进度条渲染器,它继承于JProgressBar并实现TableCellRenderer,表示这个类是一个进度条,同是也是一个列表的渲染器。
 */
public class DownloadProgressBar extends JProgressBar implements
		TableCellRenderer {
	public DownloadProgressBar() {
		super(0, 100);
		this.setStringPainted(true);
		this.setForeground(Color.green);
		// TODO Auto-generated constructor stub
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		// TODO Auto-generated method stub
		Float floatValue=Float.parseFloat(value.toString());
		int intValue=(int)floatValue.floatValue();
		this.setValue(intValue);
		this.setString(value.toString()+"%");
		return this;
	}

}


其他列的渲染器:

/*
 * 其他列(除开进度条)的渲染器
 */
@SuppressWarnings("serial")
public class DownloadTableCellRenderer extends DefaultTableCellRenderer {
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		// 判断是否需要显示图片
		if (value instanceof Icon)
			this.setIcon((Icon) value);
		else
			this.setText(value.toString());
		// 判断是否选中
		if (isSelected)
			super.setBackground(table.getSelectionBackground());
		else
			setBackground(table.getBackground());
		// 设置居中
		this.setHorizontalAlignment(JLabel.CENTER);
		this.setToolTipText(value.toString());
		return this;
	}

}

设置好每一列的渲染器之后,我们就可以来根据每一列指定相应的渲染器:

//设置列宽
		this.getColumn(DownloadTableModel.ID_COLUMN).setMinWidth(0);
		this.getColumn(DownloadTableModel.ID_COLUMN).setMaxWidth(0);
		this.getColumn(DownloadTableModel.STATE_COLUMN).setMaxWidth(40);
		this.getColumn(DownloadTableModel.FILE_NAME_COLUMN).setMinWidth(200);
		this.getColumn(DownloadTableModel.FILE_SIZE_COLUMN).setMinWidth(60);
		this.getColumn(DownloadTableModel.PLAN_COLUMN).setMinWidth(180);
		this.getColumn(DownloadTableModel.SPEED_COLUMN).setMinWidth(50);
		this.getColumn(DownloadTableModel.HAS_DOWN_COLUMN).setMinWidth(50);
		this.getColumn(DownloadTableModel.COST_TIME_COLUMN).setMinWidth(50);
		this.getColumn(DownloadTableModel.SPARE_TIME_COLUMN).setMinWidth(50);
		
		//设置单元格渲染
		this.getColumn(DownloadTableModel.STATE_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.FILE_NAME_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.FILE_SIZE_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.PLAN_COLUMN).setCellRenderer(
				new DownloadProgressBar());
		this.getColumn(DownloadTableModel.SPEED_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.HAS_DOWN_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.COST_TIME_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		this.getColumn(DownloadTableModel.SPARE_TIME_COLUMN).setCellRenderer(
				new DownloadTableCellRenderer());
		//去掉表格的线
		setShowVerticalLines(false);



在下载的过程中,许多的数据都是不停的变化的,所以我们可以设计一个类来负责处理数据:

 

/*
 * 许多的数据都是在不停的变化的,因此提供TableModel来负责处理列表中的数据。
 */
public class DownloadTableModel extends DefaultTableModel {

	//定义每一列的名称
	public final static String ID_COLUMN = "id";
	public final static String STATE_COLUMN = "状态";
	public final static String FILE_NAME_COLUMN = "文件名称";
	public final static String FILE_SIZE_COLUMN = "文件大小";
	public final static String PLAN_COLUMN = "进度";
	public final static String SPEED_COLUMN = "下载速度";
	public final static String HAS_DOWN_COLUMN = "已下载";
	public final static String COST_TIME_COLUMN = "已用时间";
	public final static String SPARE_TIME_COLUMN = "剩余时间";

	public DownloadTableModel() {
		// TODO Auto-generated constructor stub
		super();
	}
	
	
	//定义一个columnNamespace数组根据列名操作每一列。
	private static final String[] columnNames = {
        ID_COLUMN,
		STATE_COLUMN,
		FILE_NAME_COLUMN,
		FILE_SIZE_COLUMN,
		PLAN_COLUMN,
		SPEED_COLUMN,
		HAS_DOWN_COLUMN,
		COST_TIME_COLUMN,
		SPARE_TIME_COLUMN
	};
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return columnNames.length;
	}

	@Override
	public String getColumnName(int col) {
		// TODO Auto-generated method stub
		return columnNames[col];
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Object getValueAt(int row, int column) {
		// TODO Auto-generated method stub
		String columnName = this.getColumnName(column);
		// 对列名进行判断,再返回相应的数据
		return super.getValueAt(row, column);
	}

}


一下是主界面中创建Jtable的方法:

/**
	 * 创建资源列表,主下载界面 通过swing测试发现创建table的方法
	 * 
	 * @author Administrator
	 */
	private void createTable() {
		// TODO Auto-generated method stub
		DownloadTableModel tableModel = new DownloadTableModel();
		this.downloadTable = new DownloadTable();
		this.downloadTable.setModel(tableModel);
		this.downloadTable.setTableFace();
	}


不知大家是否明白?我自己都有点晕了,往下就是JTOOLBar和JList的实现,由于这两个比JTable和Jtree都简单,这里不再做介绍,

等完成后面的功能之后还会继续更新!!!!

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:77540次
    • 积分:1811
    • 等级:
    • 排名:千里之外
    • 原创:102篇
    • 转载:3篇
    • 译文:1篇
    • 评论:9条
    最新评论