按排序顺序排序Jtable(多级排序)

时间:2014-02-16 10:28:15

标签: java swing sorting jtable

我有一个JTable和一个TableRowSorter,我想通过排序顺序对列进行排序,例如,如果我有这个表的话

  

(3,3,1)
(4,3,2)
(2,4,3)
(1,2,4)
(5, 2,1)
  (3,1,1)
(2,2,5)
(4,5,4)
(1,1,3)
(1,3,2 )

当我点击A标题时,它将类似于

  

(1,2,4)
(1,1,3)
(1,3,2)
(2,4,3)
(2, 2,5)
  (3,3,1)
(3,1,1)
(4,5,4)
(4,5,4)
(5,2,1 )

但我想要的是当我点击B标题对该列进行排序时,列应该仍然像这样排序

  

(1,1,3)
(1,2,4)
(1,3,2)
(2,2,5)
(2, 4,3)
  (3,1,1)
(3,3,1)
(4,3,2)
(4,5,4)
(5,2,1 )

当我点击列c时它将是相同的

2 个答案:

答案 0 :(得分:0)

你让我看看真正古老的代码,但它仍然有用:

Table Header Demo

演示应用为here,您需要检查SVN fwutil-trunk才能使其运行。但您也可以browse获取相关的源代码。

答案 1 :(得分:0)

这并不难实现,但需要使用SwingX中的JXTable来开始。 JXTable扩展了JTable,提供了一些开箱即用的核心网格功能。但是,JXTable仍然保持相同的排序顺序,这不是预期的多列排序(至少不适合我)。请看以下几点:

首先要对sortKeys概念有一个很好的理解,sortKeys概念是包含谁被排序以及列索引顺序的列表。

  1. 扩展org.jdesktop.swingx.sort.TableSortController并覆盖toggleSortOrder方法。此方法组织跨列的排序顺序(sortKeys)。确保sortKeys列表始终采用first clicked column remains first顺序。

  2. 您将意识到删除列不会删除其排序状态,这意味着当您将列添加回来时,它将保持排序状态(标题中包含排序图标)。这可能是个人的事情,UX专家会更清楚,但我认为这不是预期的行为。要解决此问题,请展开javax.swing.event.TableColumnModelListener并删除columnRemoved事件中列的sortKey。 绑定侦听器:table.getColumnModel().addColumnModelListener(YourTableColumnModelListener(table));

  3. 此外,请确保还维护maxSortKeys,因为JXTable默认只排序3列。将此值设置为初始列数,或者每次添加/删除列时更新它(第2点)。

  4. 最后,如果您需要在标题中显示排序顺序,请查看javax.swing.table.DefaultTableCellRenderer。您需要对其进行扩展并覆盖getTableCellRendererComponent方法以获得外观和感觉。

  5. PS。在撰写本文时,SwingX的版本为1.6.x,并且没有很好的在线文档(甚至不是托管的javadocs),所以你需要使用源代码中的javadoc来找到你的方法。

    最后一点;可能你可以在不添加SwingX层的情况下实现这些。它可能只需要更多的挖掘。