带有排序和过滤功能的JTable
在JavaSE6中除了java.awt被更新外,javax.swing同时也有了很大的改进。在C/S程序中我们会经常使用到"表"。如我们 可以在查询数据库后将查询结果显示在表格中。在Java中显示表格使用的是JTable类。在以前的版本中,JTable只能简单地显示数据,并没有什么 附加的处理功能,而在JavaSE6中的JTable增加了排序和过滤功能。用户可以单击列头进行排序,也可以根据某一列来过滤表中的数据。
为了使JTable可以对数据进行,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的 数据映射成可排序的数据。在真正使用时,我们将直接使用RowSorter的子类TableRowSorter。下面的代码显示了如何将 TableRowSorter类和JTable相关联。
上面代码首先建立一个TableModel,然后将这个TableModel的实例同时传递给了JTable和RowSorter。下面是一个使用JTable排序的简单的例子。
图1和图2分别是按"姓名"进行升序和降序排列的显示结果。
图3显示的是按"年龄"进行降序排列。但我们发现一个奇怪的问题,就是"年龄"字段并不是按数值类型进行排序的,而是按字符类型进行排序的。
出现这种情况是因为在默认情况下DefaultTableModal的列是Object类型。而要想使JTable按数值进行排序,必须要覆盖DefaultTableModal的getColumnClass方法。
图4显示了按"年龄"进行排序的界面,看看,是不是按数值进行排序了。
下面让我们来看看来何使用JTable进行过滤。我们可以通过convertRowIndexToModel方法进行过滤。下面的代码加在一个按钮中添加事件代码调用JTable的过滤功能。
上面的代码并没有调用convertRowIndextoModel()方法,如果调用它,你就可以在表中进行相应的操作。
在JTable中通过抽象类RowFilter类对行进行过滤。和排序不同,你可以不建立它们的子类,而使用这个抽象类的6个静态方法。
·andFilter
·dateFilter(RowFilter.ComparisonTypetype,Datedate,int...indices)
·notFilter(RowFilter<M,I>filter)
·numberFilter(RowFilter.ComparisonTypetype,Numbernumber,int...indices)
·orFilter
·regexFilter(Stringregex,int...indices)
其中andFilter()、orFilter()以及notFilter()方法的功能是将当前的过滤条件和其它的过滤条件进行组合。如在同时比较日期和数值时需要将日期过滤和数值过滤进行组合。这些组合是非常简单的。
RowFilter的类型比较允许你进行4种关系的比较,等于、不等于、大于或小于。我们可以通过指定某一列进行过滤,也可以对所有的列进行过滤。这 其中最为有趣的也许是正则表达式过滤(regularexpressionfilter,或简称为regexfilter)。使用这个过滤器可以对 表中数据进行更高级的过滤。下面是实现一个简单过滤器的代码。
图5是上面程序的运行界面。

转自:http://hi.baidu.com/pidk/blog/item/875b44232b53eb529922edc0.html
在JavaSE6中除了java.awt被更新外,javax.swing同时也有了很大的改进。在C/S程序中我们会经常使用到"表"。如我们 可以在查询数据库后将查询结果显示在表格中。在Java中显示表格使用的是JTable类。在以前的版本中,JTable只能简单地显示数据,并没有什么 附加的处理功能,而在JavaSE6中的JTable增加了排序和过滤功能。用户可以单击列头进行排序,也可以根据某一列来过滤表中的数据。
为了使JTable可以对数据进行,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的 数据映射成可排序的数据。在真正使用时,我们将直接使用RowSorter的子类TableRowSorter。下面的代码显示了如何将 TableRowSorter类和JTable相关联。
| TableModelmodel=newDefaultTableModel(rows,columns); JTabletable=newJTable(model); RowSortersorter=newTableRowSorter(model); table.setRowSorter(sorter); |
上面代码首先建立一个TableModel,然后将这个TableModel的实例同时传递给了JTable和RowSorter。下面是一个使用JTable排序的简单的例子。
| importjavax.swing.*; importjavax.swing.table.*; importjava.awt.*; publicclassTestSortedTable { publicstaticvoidmain(Stringargs[]) { JFrameframe=newJFrame("JTable的排序测试"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //表格中显示的数据 Objectrows[][]= { {"王明","中国",44}, {"姚明","中国",25}, {"赵子龙","西蜀",1234}, {"曹操","北魏",2112}, {"BillGates","美国",45}, {"Mike","英国",33}}; Stringcolumns[]= {"姓名","国籍","年龄"}; TableModelmodel=newDefaultTableModel(rows,columns); JTabletable=newJTable(model); RowSorter<TableModel>sorter=newTableRowSorter<TableModel>(model); table.setRowSorter(sorter); JScrollPanepane=newJScrollPane(table); frame.add(pane,BorderLayout.CENTER); frame.setSize(300,150); frame.setVisible(true); } } |
图1和图2分别是按"姓名"进行升序和降序排列的显示结果。
![]() 图1按"姓名"升序显示 ![]() 图2按"姓名"降序显示 |
图3显示的是按"年龄"进行降序排列。但我们发现一个奇怪的问题,就是"年龄"字段并不是按数值类型进行排序的,而是按字符类型进行排序的。
![]() 图3按年龄降序显示 |
出现这种情况是因为在默认情况下DefaultTableModal的列是Object类型。而要想使JTable按数值进行排序,必须要覆盖DefaultTableModal的getColumnClass方法。
| TableModelmodel=newDefaultTableModel(rows,columns) { publicClassgetColumnClass(intcolumn) { ClassreturnValue; if((column>=0)&&(column<getColumnCount())) { returnValue=getValueAt(0,column).getClass(); } else { returnValue=Object.class; } returnreturnValue; } }; |
图4显示了按"年龄"进行排序的界面,看看,是不是按数值进行排序了。
![]() 图4按数值类型进行排序 |
下面让我们来看看来何使用JTable进行过滤。我们可以通过convertRowIndexToModel方法进行过滤。下面的代码加在一个按钮中添加事件代码调用JTable的过滤功能。
| button.addActionListener(newActionListener() { publicvoidactionPerformed(ActionEvente) { Stringtext=filterText.getText(); if(text.length()==0) { sorter.setRowFilter(null); } else { sorter.setRowFilter(RowFilter.regexFilter(text)); } } }); |
上面的代码并没有调用convertRowIndextoModel()方法,如果调用它,你就可以在表中进行相应的操作。
在JTable中通过抽象类RowFilter类对行进行过滤。和排序不同,你可以不建立它们的子类,而使用这个抽象类的6个静态方法。
·andFilter
·dateFilter(RowFilter.ComparisonTypetype,Datedate,int...indices)
·notFilter(RowFilter<M,I>filter)
·numberFilter(RowFilter.ComparisonTypetype,Numbernumber,int...indices)
·orFilter
·regexFilter(Stringregex,int...indices)
其中andFilter()、orFilter()以及notFilter()方法的功能是将当前的过滤条件和其它的过滤条件进行组合。如在同时比较日期和数值时需要将日期过滤和数值过滤进行组合。这些组合是非常简单的。
RowFilter的类型比较允许你进行4种关系的比较,等于、不等于、大于或小于。我们可以通过指定某一列进行过滤,也可以对所有的列进行过滤。这 其中最为有趣的也许是正则表达式过滤(regularexpressionfilter,或简称为regexfilter)。使用这个过滤器可以对 表中数据进行更高级的过滤。下面是实现一个简单过滤器的代码。
| importjavax.swing.*; importjavax.swing.table.*; importjava.awt.*; importjava.awt.event.*; publicclassTestFilter { publicstaticvoidmain(Stringargs[]) { JFrameframe=newJFrame("JTable的过滤测试"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Objectrows[][]= { {"王明","中国",44}, {"姚明","中国",25}, {"赵子龙","西蜀",1234}, {"曹操","北魏",2112}, {"BillGates","美国",45}, {"Mike","英国",33}}; Stringcolumns[]= {"姓名","国籍","年龄"}; TableModelmodel=newDefaultTableModel(rows,columns) { publicClassgetColumnClass(intcolumn) { ClassreturnValue; if((column>=0)&&(column<getColumnCount())) { returnValue=getValueAt(0,column).getClass(); } else { returnValue=Object.class; } returnreturnValue; } }; finalJTabletable=newJTable(model); finalTableRowSorter<TableModel>sorter=newTableRowSorter<TableModel>(model); table.setRowSorter(sorter); JScrollPanepane=newJScrollPane(table); frame.add(pane,BorderLayout.CENTER); JPanelpanel=newJPanel(newBorderLayout()); JLabellabel=newJLabel("过滤"); panel.add(label,BorderLayout.WEST); finalJTextFieldfilterText=newJTextField(""); panel.add(filterText,BorderLayout.CENTER); frame.add(panel,BorderLayout.NORTH); JButtonbutton=newJButton("过滤"); button.addActionListener(newActionListener() { publicvoidactionPerformed(ActionEvente) { Stringtext=filterText.getText(); if(text.length()==0) { sorter.setRowFilter(null); } else { sorter.setRowFilter(RowFilter.regexFilter(text)); } } }); frame.add(button,BorderLayout.SOUTH); frame.setSize(300,250); frame.setVisible(true); } } |
图5是上面程序的运行界面。

转自:http://hi.baidu.com/pidk/blog/item/875b44232b53eb529922edc0.html




71

被折叠的 条评论
为什么被折叠?



