让界面更加绚丽 Java SE 6.0四种新功能

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  出现这种情况是因为在默认情况下DefaultTableModal的列是Object类型。而要想使JTable按数值进行排序,必须要覆盖DefaultTableModal的getColumnClass方法。

TableModel model = new DefaultTableModel(rows, columns){ public Class getColumnClass(int column) {  Class returnValue;  if ((column >= 0) && (column < getColumnCount()))  {   returnValue = getValueAt(0, column).getClass();  }  else  {   returnValue = Object.class;  }  return returnValue; }};   图4显示了按”年龄”进行排序的界面,看看,是不是按数值进行排序了。 图4 按数值类型进行排序   下面让我们来看看来何使用JTable进行过滤。我们可以通过convertRowIndexToModel方法进行过滤。下面的代码加在一个按钮中添加事件代码调用JTable的过滤功能。 button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {  String text = filterText.getText();  if (text.length() == 0)  {   sorter.setRowFilter(null);  }  else  {   sorter.setRowFilter(RowFilter.regexFilter(text));  } }});   上面的代码并没有调用convertRowIndextoModel()方法,如果调用它,你就可以在表中进行相应的操作。  在JTable中通过抽象类RowFilter类对行进行过滤。和排序不同,你可以不建立它们的子类,而使用这个抽象类的6个静态方法。  ?andFilter  ?dateFilter(RowFilter.ComparisonType type, Date date, int… indices)  ?notFilter(RowFilter<M,I> filter)  ?numberFilter(RowFilter.ComparisonType type, Number number, int… indices)  ?orFilter  ?regexFilter(String regex, int… indices)  其中andFilter()、orFilter()以及notFilter()方法的功能是将当前的过滤条件和其它的过滤条件进行组合。如在同时比较日期和数值时需要将日期过滤和数值过滤进行组合。这些组合是非常简单的。  RowFilter的类型比较允许你进行4种关系的比较,等于、不等于、大于或小于。我们可以通过指定某一列进行过滤,也可以对所有的列进行过滤。这其中最为有趣的也许是正则表达式过滤(regular expression filter,或简称为regex filter)。使用这个过滤器可以对表中数据进行更高级的过滤。下面是实现一个简单过滤器的代码。 import javax.swing.*;import javax.swing.table.*;import java.awt.*;import java.awt.event.*;public class TestFilter{ public static void main(String args[]) {  JFrame frame = new JFrame(“JTable的过滤测试”);  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  Object rows[][] =  {   { “王明”, “中国”, 44 },   { “姚明”, “中国”, 25 },   { “赵子龙”, “西蜀”, 1234 },   { “曹操”, “北魏”, 2112 },   { “Bill Gates”, “美国”, 45 },   { “Mike”, “英国”, 33 } };  String columns[] =   { “姓名”, “国籍”, “年龄” };  TableModel model = new DefaultTableModel(rows, columns)  {   public Class getColumnClass(int column)   {    Class returnValue;    if ((column >= 0) && (column < getColumnCount()))    {     returnValue = getValueAt(0, column).getClass();    }    else    {     returnValue = Object.class;    }    return returnValue;   }  };  final JTable table = new JTable(model);  final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);  table.setRowSorter(sorter);  JScrollPane pane = new JScrollPane(table);  frame.add(pane, BorderLayout.CENTER);  JPanel panel = new JPanel(new BorderLayout());  JLabel label = new JLabel(“过滤”);  panel.add(label, BorderLayout.WEST);  final JTextField filterText = new JTextField(“”);  panel.add(filterText, BorderLayout.CENTER);  frame.add(panel, BorderLayout.NORTH);  JButton button = new JButton(“过滤”);  button.addActionListener(new ActionListener()  {   public void actionPerformed(ActionEvent e)   {    String text = 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是上面程序的运行界面。 图 5

[1][2][3][4]

命运掌握在自己手中

让界面更加绚丽 Java SE 6.0四种新功能

相关文章:

你感兴趣的文章:

标签云: