我有一个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时它将是相同的
答案 0 :(得分:0)
答案 1 :(得分:0)
这并不难实现,但需要使用SwingX中的JXTable来开始。 JXTable扩展了JTable,提供了一些开箱即用的核心网格功能。但是,JXTable仍然保持相同的排序顺序,这不是预期的多列排序(至少不适合我)。请看以下几点:
首先要对sortKeys概念有一个很好的理解,sortKeys概念是包含谁被排序以及列索引顺序的列表。
扩展org.jdesktop.swingx.sort.TableSortController
并覆盖toggleSortOrder
方法。此方法组织跨列的排序顺序(sortKeys)。确保sortKeys列表始终采用first clicked column remains first
顺序。
您将意识到删除列不会删除其排序状态,这意味着当您将列添加回来时,它将保持排序状态(标题中包含排序图标)。这可能是个人的事情,UX专家会更清楚,但我认为这不是预期的行为。要解决此问题,请展开javax.swing.event.TableColumnModelListener
并删除columnRemoved
事件中列的sortKey。
绑定侦听器:table.getColumnModel().addColumnModelListener(YourTableColumnModelListener(table));
此外,请确保还维护maxSortKeys,因为JXTable默认只排序3列。将此值设置为初始列数,或者每次添加/删除列时更新它(第2点)。
最后,如果您需要在标题中显示排序顺序,请查看javax.swing.table.DefaultTableCellRenderer
。您需要对其进行扩展并覆盖getTableCellRendererComponent
方法以获得外观和感觉。
PS。在撰写本文时,SwingX的版本为1.6.x,并且没有很好的在线文档(甚至不是托管的javadocs),所以你需要使用源代码中的javadoc来找到你的方法。
最后一点;可能你可以在不添加SwingX层的情况下实现这些。它可能只需要更多的挖掘。