`

JTable表头排序的两种方法

阅读更多
关键词:JTable,表头排序,线程安全

在Java6以前,关于JTable的表头排序是一件非常费力的事情,因为很多复杂的工作都要自己去做,但到了Java6,表头排序就变得非常简单了就一行代码:setRowSorter(new TableRowSorter<TableModel>(defaultTableModel));不过我经过实验,发现这个方法其实不怎么好用:
1.速度比较慢,进行表头排序的时候,总觉得页面刷新有些迟缓
2.点击表头的响应速度太慢了。用比较快的速度点表头,很多时候页面根本不响应点击事件。
3.表头的排序箭头是默认的,比较难看

造成以上问题的原因无非有两个,一个是TableRowSorter类比较新,没有进行优化,二是对TableRowSorter类认识不够。

下面说一下Java5及一下版本中的表头排序
Java5一下进行表头排序,必须要写很多的代码~~~,不过这样也有好处,就是式样和效率可以自己控制,所以自己写的表头排序比Java6默认的TableRowSorter好看很多,也快很多,这就复杂一些也是值得的,下面比较一下二者的表现差异。
下图是java5的表头排序画面:


下图是java6的表头排序画面:

怎么样,我们根据ID排序,利用自己的表头排序样式好看一些,速度和相应明显比使用TableRowSorter好很多。

Java5中完成表头排序的代码是比较多的也比较复杂,我想这也是为什么Java6对它进行包装的原因吧,我这里只列出构造函数的代码,更完整的代码见附件
public ZTableJava5(TableModel dm) {
		super(dm, null, null);

		JTableHeader jtableheader = getTableHeader();
		jtableheader.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent event) {
				if (event.getSource() == getTableHeader()) {
					getTableHeader().removeMouseListener(this);
					int i = columnAtPoint(event.getPoint());
					int j = convertColumnIndexToModel(i);

					if (!columnIsSortable(j)) {
						return;
					}
					if (j == sortColumn) {
						ascending = !ascending;
					} else {
						ascending = true;
						sortColumn = j;
					}

					EventQueue.invokeLater(new Runnable() {
						public void run() {
							sort();
						}
					});

					getTableHeader().addMouseListener(this);
				}
			}
		});
		jtableheader.setDefaultRenderer(createHeaderRenderer());
		if (getRowCount() > 0) {
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					reinitialize();
				}
			});
		}
		// setRowSorter(new TableRowSorter<TableModel>(defModel));
	}

Java6中完成表头排序的代码非常简单:
public ZTableJava6(TableModel dm) {
		super(dm, null, null);

		DefaultTableModel defModel = (DefaultTableModel) getModel();
		setRowSorter(new TableRowSorter<TableModel>(defModel));
	}


完整的程序请参考附件
2
0
分享到:
评论
4 楼 lliiqiang 2014-06-24  
一个对象包含多个信息,那么指向它的指针能够保证多个信息对应同步.
3 楼 石头茨 2013-05-31  
你好,我看见你也是用swing的,请问下,北京做swing的,有招人的吗?待遇怎么样?
2 楼 liomao 2011-08-09  
这个东西import javax.swing.table.TableRowSorter; Java5没有的。
你在ZTableJava5.java中用到了··
1 楼 liomao 2011-08-09  

相关推荐

    JTable实现行间拖拽的最简单方法

    本文将详细介绍如何通过一种简单的方法,为`JTable`添加行间拖拽功能,而无需对已有代码进行大规模修改或实现复杂的DnD接口。 首先,理解`JTable`的基本结构是至关重要的。`JTable`由`TableModel`、`...

    jtable使用参考

    有两种主要的方式创建表格:一种是通过数组直接初始化表格数据;另一种是通过`DefaultTableModel`来动态管理表格数据。 **方式一:直接使用数组创建表格** ```java Object[][] cellData = { {"row1-col1", "row1-...

    MulitiTable

    通过分析源代码,我们可以学习到如何结合这两种合并方式,以创建复杂的多表头效果。这通常涉及到对表格模型的精细操作,以及对JTable渲染机制的深入理解。 总结来说,实现JTable的单元格合并需要对Swing组件模型有...

    Swing下滚动条实现仿分页

    JTable可以与TableModel配合,使数据动态更新,同时支持排序、选择和编辑等功能。在“仿分页”实现中,JTable可能被用来显示数据集的一个“页面”,当用户滚动滚动条时,JTable会显示数据集的下一“页面”。 ...

    Tree和grid

    在IT领域,"Tree"和"Grid"是两种常见的数据展示和操作的组件,广泛应用于各种用户界面(UI)设计,特别是在数据管理、文件系统、数据库应用等场景中。它们各自有着独特的特性和应用场景。 首先,让我们理解"Tree"的...

    功能齐全的datagrid.rar

    8. 内联编辑和弹出编辑:两种编辑模式供选择,满足不同场景需求。 9. 行选择:单选或多选行,便于操作或批量处理数据。 10. 自动调整列宽:根据内容自动调整列宽,保持数据的完整显示。 11. 表格样式:提供多种预设...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例054 使用sort方法对数组进行排序 67 实例055 反转数组中元素的顺序 68 3.4 常用集合的使用 69 实例056 用动态数组保存学生姓名 69 实例057 用List集合传递学生信息 70 实例058 用TreeSet生成不重复自动排序 随机...

Global site tag (gtag.js) - Google Analytics