正 文

轻松使用Swing的树


www.7dspace.com  更新日期:2006-2-19 17:30:48  七度空间


树是常见的图形用户界面的组件,Swing提供了类库用于创建树,然而,对树使用动态数据可能会引起麻烦,本文将说明如何避免这些缺陷。

如果你曾经使用JTree的树组件编写过Swing代码,你可能已经知道Swing的树是一个复杂的事物,如果一步不慎就会非常麻烦;相对而言,使用静态数据来创建树会容易些,但是当数据开始变化的时候,JTree的代码会很快陷入沼泽。有个好消息是可以使用一种“禅宗”编程方法,生成的应用程序可以让你在JTree的代码上获得更多的控制能力。

让我们先来看看JTree的“传统”工作方法,在“传统路线”中,使用DefaultTreeModel并创建包含数据对象的 DefaultMutableTreeNode实例,添加或删除子结点可以改变树的结构,这看上去很简单,在数据变化的过程中生成树,然而此时你会发现为生成这个“大”树已经使用了相当多的内存,更可怕的是,复杂的Swing线程问题会将你引入奇怪的错误,显示这棵树不再和你所想象的数据结构同步。

在我举的例子中,所要处理的问题是管理一棵包含了数千条消息的树,这些消息是从在线服务中收集到的,同时还要解决如何将这些关联信息再现为树的问题,这听上去很容易,但是消息数据库中有很多由多个代理处理后新加入的信息,这使得这些数据更加动态。因为我已经将树形关系在消息数据库中进行管理,如果在内存中再创建一个完全重复的树就有些多余了,试图对消息(其容量可能相当大)载入的过程进行管理意味着最差的结果;在对离散的数据全面最优化缓存的帮助下,图形用户界面的逻辑可以和商务逻辑层整合。

那么,“禅宗”的方法又是指的什么呢?让我们从DefaultTreeModel开始,DefaultTreeModel是用来管理与JTree升级相关的事件的,DefaultTreeModel是TreeModel界面的一个实现,如果你以前曾经使用过表格组件JTable,就会知道它使用了 DefaultTableModel,DefaultTableModel是对AbstractTableModel的扩展了,它实现了 TableModel的界面。AbstractTableModel中包含了所有需要用于通知JTable表的动态改变的方法, DefaultTableModel使用的正是这些方法,如果你创建一个自己的表模型(TableModel),则需要扩展 AbstractTableModel,所以如果我们对树叶应用这样的逻辑,那么应该对AbstractTreeModel进行扩展。

这里的问题在于Swing中没有AbstractTreeModel,关于TreeModelEvent是如何生成和发送到树的唯一的定义方法是将其封装在DefaultTreeModel中,没有人知道为什么只有这种方法可行,但是这确实给创建新的模型造成了很多的麻烦,幸好,现在有第三方工具可以完成同样的任务,我使用的是Christian Kaufhold的公共域版本,它为事件的使用附加了便捷的功能。

2页,页码:[1] [2] 

上一篇:使用JavaScript执行多重周期 ID cookies
下一篇:EJB的七年之痒
标题:轻松使用Swing的树 作者: 来源:开发者在线
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐