JTable采用的是MVC模式,JTable控制可视外观,TableModel控制数据模型。JTable不存储数据,所有的数据都从TableModel得到。TableModel可以存储数据,也可以不存储数据直接通过计算得到。这里要实现点击某列,根据此列将所有的行进行排序。
将JTable看作是视图层,TableModel看作是物理存储层。通过在视图层和物理存储层之间增加一个逻辑存储层来实现JTable的排序和过滤。即通过逻辑层在视图层和物理层之间建立一种映射,在JTable上获得的是逻辑下标,然后通过逻辑层的映射转换将逻辑下标变换为数据模型的物理下标。而按照某列对所有行进行排序实际是对逻辑层中的逻辑下标对应的物理下标进行的逻辑排序,TableModel实际上并没有被改变。
SortingTableModel中Row[] rows保存着视图层到物理层的映射,通过
rows[i].getIndex()即可以将逻辑下标i转换为物理下标。Row包含属性物理下标index,同时实现了接口Comparable,因为要用到Arrays.sort()对rows中的内容进行排序。SortingTableModel继承AbstractTableModel,包含只有DefaultTableModel一个参数的构造方法,也就是通过物理层(DefaultTableModel)初始化逻辑层(SortingTableModel)。最好在实现AbstractTableModel中的几个抽象方法就完成了逻辑层的编写。不多说,直接贴代码
还可以通过增加逻辑层实现行的隐藏于显示,因为JTable没有提供此类方法。
分层的思想在计算机领域应用广泛,类似的可以想到计算机网络的七层体系结构,web应用的分层(就想到这些)。分层绝对是程序设计的利器,可以降低模块的耦合性,提高内聚性,还可以方便的实现复用。日后需要好好学习,好好沉淀以把握其精髓。