8

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
.
.
.

私が達成したいのは、第1レベルのノードでのみ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
.
.
.

ご覧のとおり、これは単純なテーブルの並べ替えに似ています(したがって、並べ替えを無効にするために呼び出される階層の制限が解除されます)。

それを行うには2つの可能性があります。

  1. JXTableで使用可能な並べ替えメカニズムを再度有効にして、すでに実装されているすべての機能(並べ替え、ヘッダーをクリックして並べ替えなど)を利用し、最初のレベルのノードのみを並べ替えます(子は同じ親を持つため) 。
  2. 必要な基本的なものを実装し(主にヘッダーをクリックして並べ替えます)、JXSortableTreeModelにmodel-row-idのリストを用意します。これを並べ替えて、convertRowIndexToModelをオーバーライドします。これにより、(私が思うに)自分のアイテムを好きなように並べ替えて表示できます。

私のお気に入りはもちろん最初のものですが、それを達成する方法がわかりません。最初の制限は、JXTreeTableがsetSortable()(および関連するすべてのメソッド)をオーバーライドするため、並べ替えを再度有効にする方法がわからないことと、JXTableのメソッドの実装に直接アクセスする方法がわからないことです(これはJavaの問題です)。 )。JXTreeTableのコードをコピーしてオーバーライドを削除することもできますが、それは私の意見ではオプションではありません。

これを解決するとしたら、並べ替えを第1レベルのノードに制限するにはどうすればよいですか?ソースを見た後でも、私はそれを行う方法についてかなり無知です。

2つ目では、既存のコードのすべての利点を失いますが、私が望むものを達成するための実用的な方法がわかります(少なくとも、今のところ、すべての行のデータをフィルター処理したくないかどうかは誰にもわかりません)。

別の方法はありますか?そうでない場合は、どのソリューションを選択する必要がありますか?洞察に満ちたコメントはありますか?

よろしくお願いします!

4

2 に答える 2

3

多分 aephyrによって TreeTable を次のように並べ替えます。ところで、この Swing Guru は Nimbus のルック アンド フィールでもプレイしました。面白い Nimbus のコードが含まれています

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

于 2012-03-01T14:29:28.393 に答える
2

ノードレベルで遊んでなんとかできました。これは、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());
    }
}

スレッドオープナーがすでにそれを理解していると思うので、これが他の誰かに役立つことを願っています.

于 2013-08-09T17:31:51.383 に答える