JTable的排序和过滤(分层的思想)

      JTable采用的是MVC模式,JTable控制可视外观,TableModel控制数据模型。JTable不存储数据,所有的数据都从TableModel得到。TableModel可以存储数据,也可以不存储数据直接通过计算得到。这里要实现点击某列,根据此列将所有的行进行排序。

      将JTable看作是视图层,TableModel看作是物理存储层。通过在视图层和物理存储层之间增加一个逻辑存储层来实现JTable的排序和过滤。即通过逻辑层在视图层和物理层之间建立一种映射,在JTable上获得的是逻辑下标,然后通过逻辑层的映射转换将逻辑下标变换为数据模型的物理下标。而按照某列对所有行进行排序实际是对逻辑层中的逻辑下标对应的物理下标进行的逻辑排序,TableModel实际上并没有被改变。

                JTable的排序和过滤(分层的思想)_第1张图片

      SortingTableModel中Row[] rows保存着视图层到物理层的映射,通过

rows[i].getIndex()即可以将逻辑下标i转换为物理下标。Row包含属性物理下标index,同时实现了接口Comparable,因为要用到Arrays.sort()对rows中的内容进行排序。SortingTableModel继承AbstractTableModel,包含只有DefaultTableModel一个参数的构造方法,也就是通过物理层(DefaultTableModel)初始化逻辑层(SortingTableModel)。最好在实现AbstractTableModel中的几个抽象方法就完成了逻辑层的编写。不多说,直接贴代码 import javax.swing.*; import javax.swing.table.*; import java.awt.event.*; import java.util.*; import java.awt.*; public class JTableSortTest { public static void main(String[] arg){ new JTableSortFrame(); } } class JTableSortFrame extends JFrame { private JTable table; private DefaultTableModel model;///实际存储数据的TableModel private SortTableModel sortModel;///逻辑层TableModel private Object[][] cells = { { "Mercury", 2440.0, 0, false, Color.YELLOW }, { "Venus", 6052.0, 0, false, Color.YELLOW }, { "Earth", 6378.0, 1, false, Color.BLUE }, { "Mars", 3397.0, 2, false, Color.RED }, { "Jupiter", 71492.0, 16, true, Color.ORANGE }, { "Saturn", 60268.0, 18, true, Color.ORANGE }, { "Uranus", 25559.0, 17, true, Color.BLUE }, { "Neptune", 24766.0, 8, true, Color.BLUE }, { "Pluto", 1137.0, 1, false, Color.BLACK } }; private String[] columnNames = { "Planet", "Radius", "Moons", "Gaseous", "Color" }; public JTableSortFrame(){ model=new DefaultTableModel(cells,columnNames); sortModel=new SortTableModel(model); table=new JTable(sortModel); //为列标题添加时间监听,响应双击事件 table.getTableHeader().addMouseListener( new MouseAdapter(){ public void mouseClicked(MouseEvent e){ if(e.getClickCount()<2) return; int colIndex=table.columnAtPoint(e.getPoint()); sortModel.setColumn(colIndex); sortModel.sort(); sortModel.fireTableDataChanged();//通知关心此事件的监听器 } } ); add(new JScrollPane(table),BorderLayout.CENTER); setSize(400,200); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class SortTableModel extends AbstractTableModel { private DefaultTableModel model; private Row[] Rows;//逻辑下标到物理下标的映射 private int column;//当前双击的列,依据此列进行排序 public SortTableModel(DefaultTableModel _model){ this.model=_model; //初始化Rows及其index Rows=new Row[model.getRowCount()]; for(int i=0;i<Rows.length;i++) Rows[i]=new Row(i); } public int getRowCount(){ return model.getRowCount(); } public int getColumnCount(){ return model.getColumnCount(); } public void setColumn(int col){ column=col; } public String getColumnName(int col){ return model.getColumnName(col); } public Object getValueAt(int row,int column){ return model.getValueAt(Rows[row].index,column); } //对相应列进行排序 public void sort(){ Arrays.sort(Rows); } private class Row implements Comparable<Row> { private int index;//物理索引 public Row(int _index){ index=_index; } public int getIndex(){ return index; } public void setIndex(int _index){ index=_index; } public int compareTo(Row other){ if(model.getValueAt(index,column) instanceof Comparable) return ((Comparable)(model.getValueAt(index,column))).compareTo(model.getValueAt(other.getIndex(),column)); return model.getValueAt(index,column).toString().compareTo(model.getValueAt(other.getIndex(),column).toString()); } } }

 

      还可以通过增加逻辑层实现行的隐藏于显示,因为JTable没有提供此类方法。

      分层的思想在计算机领域应用广泛,类似的可以想到计算机网络的七层体系结构,web应用的分层(就想到这些)。分层绝对是程序设计的利器,可以降低模块的耦合性,提高内聚性,还可以方便的实现复用。日后需要好好学习,好好沉淀以把握其精髓。

你可能感兴趣的:(String,object,table,存储,Class,import)