【问题标题】:How to make a JXTreeTable sort its top elements如何使 JXTreeTable 对其顶部元素进行排序
【发布时间】:2012-03-18 23:07:06
【问题描述】:

我知道(我已经查看了来源;))在 JXTreeTable 上的排序已被禁用。

但是,我希望允许仅基于根节点的直接子节点的值对所有列进行排序。

假设我有这样的结构:

Name       / Date       / File UID
(Root)
|- Mr. X   / 1996/10/22 / AE123F6D
|--- File1 / 2012/01/10 / DFC2345Q
|--- File2 / 2012/01/11 / D321FEC6
|- Mrs. Y  / 1975/03/03 / G2GF35EZ
|--- File3 / 2012/02/29 / 35GERR32
|--- File4 / 2012/01/22 / LKJY2342
.
.
.

我想要实现的是仅在第一级节点上对 3 列进行排序。假设我想按升序对它进行排序,结果会是这样:

Name       / Date       / File UID
(Root)
|- Mrs. Y  / 1975/03/03 / G2GF35EZ
|--- File3 / 2012/02/29 / 35GERR32
|--- File4 / 2012/01/22 / LKJY2342
|- Mr. X   / 1996/10/22 / AE123F6D
|--- File1 / 2012/01/10 / DFC2345Q
|--- File2 / 2012/01/11 / D321FEC6
.
.
.

在我看来,它类似于简单的表格排序(因此取消了为禁用排序而调用的层次限制)。

我看到了两种可能性:

  1. 重新启用 JXTable 中可用的排序机制,以便从已经实现的所有内容中受益(排序器、通过单击标题进行排序...)并且仅对第一级的节点进行排序(因为它们的子节点仍然具有同一父母)。
  2. 实现我需要的基本内容(主要通过单击标题进行排序),在 JXSortableTreeModel 中有一个模型行 ID 列表,我对其进行排序并覆盖 convertRowIndexToModel,这将允许(我认为)按我的顺序显示我的项目想要。

我最喜欢的当然是第一个,但我不知道如何实现它。第一个限制是我不知道如何重新启用排序,因为 JXTreeTable 覆盖了 setSortable() (以及所有相关方法),我不知道如何直接访问 JXTable 中方法的实现(这是一个 Java 问题)。我可以简单地复制 JXTreeTable 的代码并删除覆盖,但我认为这不是一个选项。

假设我解决了这个问题,我将如何将排序限制在一级节点?即使在查看源代码之后,我也对如何做到这一点一无所知。

使用第二个,我失去了现有代码的所有好处,但我看到了一种实用的方法来实现我想要的(至少现在是这样。谁知道是否不想过滤所有行上的数据?) .

还有其他方法吗?如果不是,我应该选择哪一种解决方案?有什么有见地的cmets?

非常感谢!

【问题讨论】:

    标签: java swing jtable swingx jxtreetable


    【解决方案1】:

    我设法通过在节点级别上玩来做到这一点。这是我在树表节点中创建的扩展 AbstractMutableTreeTableNode 的方法:

    /**
     * This method recursively (or not) sorts the nodes, ascending, or descending by the specified column.
     * @param sortColumn Column to do the sorting by.
     * @param sortAscending Boolean value of weather the sorting to be done ascending or not (descending).
     * @param recursive Boolean value of weather or not the sorting should be recursively applied to children nodes.
     * @author Alex Burdu Burdusel
     */
    public void sortNode(int sortColumn, boolean sortAscending, boolean recursive) {
        mLastSortAscending = sortAscending;
        mLastSortedColumn = sortColumn;
        mLastSortRecursive = recursive;
    
        int childCount = this.getChildCount();
        TreeMap<Object, BRFTreeTableNode> nodeData = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    
        for (int i = 0; i < childCount; i++) {
            BRFTreeTableNode child = (BRFTreeTableNode) this.getChildAt(i);
            if (child.getChildCount() > 0 & recursive) {
                child.sortNode(sortColumn, sortAscending, recursive);
            }
            Object key = child.getData()[sortColumn];
            nodeData.put(key, child);
        }
    
        Iterator<Map.Entry<Object, BRFTreeTableNode>> nodesIterator;
        if (sortAscending) {
            nodesIterator = nodeData.entrySet().iterator();
        } else {
            nodesIterator = nodeData.descendingMap().entrySet().iterator();
        }
    
        while (nodesIterator.hasNext()) {
            Map.Entry<Object, BRFTreeTableNode> nodeEntry = nodesIterator.next();
            this.add(nodeEntry.getValue());
        }
    }
    

    希望这对其他人有所帮助,因为我认为线程开启者已经弄清楚了。

    【讨论】:

      【解决方案2】:

      maybe sorting TreeTable following way(s),作者 aephyr,顺便说一句,这位 Swing Guru 也使用 Nimbus Look and Feel,包括有趣的 Nimbus 代码

      【讨论】:

      • 谢谢!我浏览了 TreeTable 的来源,我必须说,这看起来很有希望。稍后我会尝试更好地查看它:)
      • Aephyr 的解决方案运行良好,但源代码几乎不包含任何文档或 cmets。该演示是一个很好的例子,但我仍然遇到了几个在 EDT 上抛出的异常。在这样的代码中调试和支持这些以及未来的问题让我很头疼。
      • @nate 这是一位伟大的 Swing 大师的代码展览,aephyr 所属的几个论坛的代码库,不知道 EDT 异常或违规,您的代码肯定存在次要问题:- )
      • 链接失效
      • @Markus Weninger 似乎是它放弃的代码的作者(永远)
      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多