这两天忙里偷闲,写了一个部门功能类型迅雷的.但还不是非常全.
现在就把个人的一些心得与大家分享一下:
首先是界面设计上:
从整个界面可以看出这是由JTree,JTable这两个相对来说比较重量级的组件组成.
所以了两个函数一个用于创建JTree,另一个用于创建JTable
其部分代码如下:
1.JT
* initJTree(构造JTree)
*/
private JTree createJTree( final CardLayout cardLayout1, final JPanel leftJP) ... {
DefaultMutableTreeNode top = new DefaultMutableTreeNode();
top.setUserObject(new JtreeNode(XUN_LEI, Pic.crateIcon("jtree/root.png"), "下载"));
MyMutableTreeNode.createNode(top);
JTree jtree = new JTree(top);
jtree.addTreeSelectionListener(new TreeSelectionListener() ...{
@Override
public void valueChanged(TreeSelectionEvent e) ...{
TreePath path = e.getPath();
if (path != null) ...{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
JtreeNode jtreeNode = (JtreeNode) node.getUserObject();
switch (jtreeNode.getType()) ...{
case ON_DOWN:
cardLayout1.show(leftJP, "正在下载");
break;
case BEEN_DOWNED:
cardLayout1.show(leftJP, "已下载");
break;
case DUSTBIN:
cardLayout1.show(leftJP, "垃圾箱");
break;
}
}
}
});
jtree.setCellRenderer(new MyJTreeCellRenderer());
return jtree;
}
MyJTreeCellRenderer是自己定义的渲染器,实现接口AbstractTableCellRenderer
2.JTable
* crate The Three JTable
*/
private JTable crateJTable( int type) ... {
JTable jtable = null;
switch (type) ...{
case ON_DOWN:
String[] ondownStr = ...{"状态", "文件名称", "文件大小", "进度", "速度", "资源", "剩余时间", "用时", "文件类型"};
int[] ondownIn = ...{40, 100, 100, 200, 40, 50, 80, 100, 400};
jtable = new JTable(new OndownTableModel(allTaskManager.getSubTask(ON_DOWN), statusHash), new OndownTableColumnModel(ondownIn, ondownStr));//正在下载
break;
case BEEN_DOWNED:
String[] beenDownAndDustbinStr = ...{"状态", "文件名称", "博客", "文件大小", "文件类型", "注释", "日期"};
int[] beenDownAndDustbinIn = ...{40, 100, 100, 200, 400, 200, 100};
jtable = new JTable(new DustbinTableModel(allTaskManager.getSubTask(BEEN_DOWNED), statusHash), new BeenDownedTableColumnModel(beenDownAndDustbinIn, beenDownAndDustbinStr));//已经下载
break;
case DUSTBIN:
String[] beenDownAndDustbinStr1 = ...{"状态", "文件名称", "博客", "文件大小", "文件类型", "注释", "日期"};
int[] beenDownAndDustbinIn1 = ...{40, 100, 100, 200, 400, 200, 100};
jtable = new JTable(new DustbinTableModel(allTaskManager.getSubTask(DUSTBIN), statusHash), new DustbinTableColumnModel(beenDownAndDustbinIn1, beenDownAndDustbinStr1));//垃圾箱
break;
}
jtable.setRowHeight(16);
jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//设置最大化时,表也自动跟着最大化
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jtable.getTableHeader().setReorderingAllowed(false);
return jtable;
}
设置一些相关参数,根据请求的类型进行创建JTable,三个JTable创建好之后,我们就可以点击JTree跳到相应的界面,这时我们最好用CardLayout, 就可以随意切换到相应的JTable.
在界面设计上就讲到这些.由于其它的设计相对比较繁杂,这里也就不多说了.
其次就是流程设计:
程序主要有三个主要板块:正在下载,已下载,垃圾箱.(相应的由三个JTabel)
当从"正在下载"里删除一个任务时,它会被放到"垃圾箱",但当把它从"垃圾箱"移动时,它又会被移动到"正在下载",
我们把每一个任务定义为SubTask:这主要有如下这些参数:
private int type; // 任务类型 (正在下载,已经下载,垃圾箱)
private int status = ONDOWNLOAD; // 任务状态(正在下载,暂停下载,下载失败,下载完毕)
private String fileName; // 文件名称
private long length; // 文件大小
private int progress = 40 ; // 文件进度
private String resource; // 资源
private float speed; // 下载速度
private int restTime; // 剩余时间
private int takeTime; // 用时(已经花了的时间)
private String fileType; // 文件类型
private String note; // 文件注释
private Time date; // 下载日期
private String blog; // 博客
接着定义三个TaksManger(为三个JTable( "正在下载","已下载","垃圾箱")
每个TaskManager里包涵着相应的SubTask,TaskManager里的变量是:
List<SubTask> list;
那么,当我们要从一个任务区里移动一个任务到另一个任务区里,要怎么实现呢?
我们就必须再定义一个用来管理这三个TaksManager. 这个类叫做AllTaksManager
用来管理这三个TaksManager,当移动一个任务时要把它先把它添加到目的列表,再从相应的列表中除去.
具体实现也就是对三个列表的操作.以上是比较简单但又是核心的一些设计.