Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7249152
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68080
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:49:01

下载本文示例代码
  在上一篇中我介绍了Java SE 6在GUI上的部分改进。在这篇文章中我接着介绍另外几种新的GUI功能。这些功能是:  ·带有排序和过滤功能的JTable。  ·增强的JTabbedPane组件  ·增强的打印功能  ·增强的拖放功能   带有排序和过滤功能的JTable  在Java SE 6中除了java.awt被更新外,javax.swing同时也有了很大的改进。在C/S程序中我们会经常使用到"表"。如我们可以在查询数据库后将查询结果显示在表格中。在Java中显示表格使用的是JTable类。在以前的版本中,JTable只能简单地显示数据,并没有什么附加的处理功能,而在Java SE 6中的JTable增加了排序和过滤功能。用户可以单击列头进行排序,也可以根据某一列来过滤表中的数据。  为了使JTable可以对数据进行,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的数据映射成可排序的数据。在真正使用时,我们将直接使用RowSorter的子类TableRowSorter。下面的代码显示了如何将TableRowSorter类和JTable相关联。 TableModel model = new DefaultTableModel(rows, columns);JTable table = new JTable(model);RowSorter sorter = new TableRowSorter(model);table.setRowSorter(sorter);  上面代码首先建立一个TableModel,然后将这个TableModel的实例同时传递给了JTable和RowSorter。下面是一个使用JTable排序的简单的例子。 import javax.swing.*;import javax.swing.table.*;import java.awt.*;public class TestSortedTable{ 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);  JTable table = new JTable(model);  RowSorter sorter = new TableRowSorter(model);  table.setRowSorter(sorter);  JScrollPane pane = new JScrollPane(table);  frame.add(pane, BorderLayout.CENTER);  frame.setSize(300, 150);  frame.setVisible(true); }}  图1和图2分别是按"姓名"进行升序和降序排列的显示结果。 图1 按"姓名"升序显示图2 按"姓名"降序显示  图3显示的是按"年龄"进行降序排列。但我们发现一个奇怪的问题,就是"年龄"字段并不是按数值类型进行排序的,而是按字符类型进行排序的。 图3 按年龄降序显示  出现这种情况是因为在默认情况下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 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 sorter = new TableRowSorter(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 ·Java初学者专区  ·Java高级技术 E夏Java轻松行 JBuilder 2005全接触 从老虎到野马 Java 6.0新功能观察 ·Java图像与多媒体 ·Java网络编程 ·Eclipse ·Hibernate ·Spring ·Struts ·Java设计模式 ·EJB开发   查看 Java Java GUI Java6 的全部文章共4页。 1 2 3 4 :   在上一篇中我介绍了Java SE 6在GUI上的部分改进。在这篇文章中我接着介绍另外几种新的GUI功能。这些功能是:  ·带有排序和过滤功能的JTable。  ·增强的JTabbedPane组件  ·增强的打印功能  ·增强的拖放功能   带有排序和过滤功能的JTable  在Java SE 6中除了java.awt被更新外,javax.swing同时也有了很大的改进。在C/S程序中我们会经常使用到"表"。如我们可以在查询数据库后将查询结果显示在表格中。在Java中显示表格使用的是JTable类。在以前的版本中,JTable只能简单地显示数据,并没有什么附加的处理功能,而在Java SE 6中的JTable增加了排序和过滤功能。用户可以单击列头进行排序,也可以根据某一列来过滤表中的数据。  为了使JTable可以对数据进行,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的数据映射成可排序的数据。在真正使用时,我们将直接使用RowSorter的子类TableRowSorter。下面的代码显示了如何将TableRowSorter类和JTable相关联。 TableModel model = new DefaultTableModel(rows, columns);JTable table = new JTable(model);RowSorter sorter = new TableRowSorter(model);table.setRowSorter(sorter);  上面代码首先建立一个TableModel,然后将这个TableModel的实例同时传递给了JTable和RowSorter。下面是一个使用JTable排序的简单的例子。 import javax.swing.*;import javax.swing.table.*;import java.awt.*;public class TestSortedTable{ 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);  JTable table = new JTable(model);  RowSorter sorter = new TableRowSorter(model);  table.setRowSorter(sorter);  JScrollPane pane = new JScrollPane(table);  frame.add(pane, BorderLayout.CENTER);  frame.setSize(300, 150);  frame.setVisible(true); }}  图1和图2分别是按"姓名"进行升序和降序排列的显示结果。 图1 按"姓名"升序显示图2 按"姓名"降序显示  图3显示的是按"年龄"进行降序排列。但我们发现一个奇怪的问题,就是"年龄"字段并不是按数值类型进行排序的,而是按字符类型进行排序的。 图3 按年龄降序显示  出现这种情况是因为在默认情况下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 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 sorter = new TableRowSorter(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 ·Java初学者专区  ·Java高级技术 E夏Java轻松行 JBuilder 2005全接触 从老虎到野马 Java 6.0新功能观察 ·Java图像与多媒体 ·Java网络编程 ·Eclipse ·Hibernate ·Spring ·Struts ·Java设计模式 ·EJB开发   查看 Java Java GUI Java6 的全部文章共4页。 1 2 3 4 : 下载本文示例代码


让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能让界面更加绚丽 Java SE 6.0四种新功能
阅读(1182) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~