【问题标题】:Sorting Jtable by sort order(multi level sort)按排序顺序对Jtable进行排序(多级排序)
【发布时间】:2014-02-16 10:28:15
【问题描述】:

我有一个 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)

当我点击一个标题时,它会像

(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 标题对该列进行排序时,A 列仍应像这样排序

(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 列时,它会是一样的

【问题讨论】:

  • 描述您的要求并要求某人为您编写代码或向您解释如何编写代码的问题对于 Stack Overflow 来说是题外话。请确定有关编程的特定问题或问题。包括尝试的解决方案、结果与预期结果有何不同的解释,以及您收到的任何错误消息。请阅读this advice on how to ask good questions
  • @trashgod 这是一个很好的起点,但很快你就会意识到使用sortKeys.add() 方法并不能解决 OP 遇到的问题。因为,其中一个核心方法(toggleSortOrder)会重新组织 sortKeys 列表并破坏你的修改。

标签: java swing sorting jtable


【解决方案1】:

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

首先对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 方法以获得外观效果。

PS。在撰写本文时,SwingX 的版本为 1.6.x,并且没有很好的在线文档(甚至没有托管 javadocs),因此您需要使用源代码中的 javadocs 来找到自己的方式。

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

【讨论】:

    【解决方案2】:

    你让我看了很老的代码,但它仍然有效:

    演示应用程序是 here,您需要签出 Git HVLayout-master 才能运行它。但您也可以只 browse 获取相关源代码。 让它运行(用 Java 11 测试):

    git clone https://github.com/fwi/HVLayout.git
    cd HVLayout
    mvn verify
    cd swing-demo/target/
    # For Windows use 'javaw' instead of 'java'
    java -cp swing-demo-lib.jar nl.fw.swing.demo.TableSortDemo
    

    【讨论】:

    • 链接失效了,能否提供有效链接或示例代码
    • @PaulTaylor 我更新了链接并添加了一些运行说明。我有点惊讶它仍然有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2021-04-10
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多