2012-02-29 15 views
8

JXTreeTableでの並べ替えが無効になっていることを知っています。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 
. 
. 
.

私はそれを見ると、それはソート単純なテーブルにressembles(そうソートを無効にするために呼び出さ階層制限が解除されます)。

が、私はそれを行うための2つの可能性を参照してください。

  1. 再度有効にすでに実装されているすべての恩恵を受けるためにJXTableで利用可能なソート機構(見出しをクリックするとソートソーター、...)と最初のレベルのノードをソートするだけです(子が同じ親を持つため)。
  2. 私は必要なものを実装しています(ほとんどの場合、ヘッダをクリックしてソートします)、JXSortableTreeModelのmodel-row-idsのリストを持っていて、convertRowIndexToModelをオーバーライドしています。欲しいです。

私のお気に入りはもちろん最初のものですが、達成方法はわかりません。最初の制限は、JXTreeTableがsetSortable()(および関連するすべてのメソッド)をオーバーライドするのでソートを再び有効にする方法がわからず、JXTableのメソッドの実装に直接アクセスする方法がわかりません(Javaの問題です)。私は単純にJXTreeTableのコードをコピーし、上書きを削除することができますが、それは私の意見では選択肢ではありません。

私はこれを解決すると言いますが、どのようにしてソートを第1レベルのノードに制限しますか?ソースを見た後でも、私はそれをどうやって行うのかがむしろ分かりません。

2番目のコードでは、既存のコードのすべての利点を失っていますが、私が望むものを実現するための実用的な方法があります(今のところ、少なくともすべての行のデータをフィルタリングしたくない場合は誰ですか? )。

別の方法がありますか?そうでない場合は、私のソリューションのどちらを選択すればよいですか?どんな洞察力のあるコメント?

事前に感謝します。

答えて

3

maybe sorting TreeTable following way(s)は、aephyrにより、ところでこのスイング達人は、ニンバスの表情で演奏し、あまりにも感じて、面白いニンバスのコードは、私はそれを行うために管理

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

+0

ありがとうございます!私はTreeTableのソースを閲覧しましたが、これは有望です。私は後でもっとよく見てみるつもりです:) – ixM

+1

Aephyrのソリューションはうまくいきますが、ソースコードにはほとんどドキュメンテーションやコメントは含まれていません。デモは良い例ですが、私はまだEDTにいくつかの例外がスローされています。このようなコードで、これらの問題や将来の問題をデバッグし、サポートすることの頭痛は、私にとって大したものではありません。 – Nate

+0

@nateこれは、偉大なスイング教祖の1人、コードのデポで、いくつかのフォーラムでは、メンバーがメンバーです、EDTの例外や違反については考えられません。コードから二次的な問題がある必要があります:-) – mKorbel

1

を含まノードレベルで遊ぶことによって。私は、スレッドオープナーはすでにそれを考え出したと思うので、これは、他の誰かを助け

/** 
* 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()); 
    } 
} 

希望:これは私がAbstractMutableTreeTableNodeを拡張し、私のツリーテーブルのノードに作成する方法です。

関連する問題