您的位置:首页 > 编程语言 > Java开发

java多线程下载工具(二)

2012-03-29 17:26 232 查看


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都简单,这里不再做介绍,

等完成后面的功能之后还会继续更新!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: