2011-03-03 10 views
3

setAutoCreateRowSorter(true)とRowSorterListenerを使用してJTableを作成しました。これは、JTableのソート時にアプリケーションの別の場所で操作を実行する必要があるためです。更新されたポストソートTableModelを取得するにはどうすればよいですか?

ソートする列ヘッダーをクリックするたびに、JTableは適切な順序で行を再表示し、リスナーが呼び出されますが、取り出したTableModelは常に元のプリソートテーブルモデルです。

JTableに表示されるように、新しいポストソート順を取得するにはどうすればよいですか?

+0

JTableでRowSorterをどのように初期化していますか? ここで私が気付いたのは、DefaultRowSorter: "DefaultRowSorterは抽象クラスです。具体的なサブクラスは、setModelWrapperを呼び出すことによって、基礎となるデータへのアクセスを提供する必要があります。setModelWrapperメソッドは、コンストラクタが呼び出された直後にModelWrapperを指定せずにDefaultRowSorterを使用すると、未定義の動作が発生します。 " – LazyCubicleMonkey

+0

table.convertRowIndexToModel(int ...)を使用できると思いますが、より良い解決策があると思います。 – LazyCubicleMonkey

+0

私は 'table.setAutoCreateRowSorter(true)'以外何もしていません。 OracleのJTablesチュートリアルによれば、「このアクションは、javax.swing.table.TableRowSorterのインスタンスである行ソートを定義します。」私はそれを手動で初期化する必要はないと思いますか? – Greg

答えて

4

のTableModel内のデータ、データの変更のみ表示を変更することはありません。

あなたはそれが表に表示されているために、モデルからのデータを望むなら、あなただけを使用します。つまり

table.getValueAt(row, column); 

あなたがデータを取得するために、すべての行と列を反復処理する必要があります現在表示されている順序で表示します。

+1

+1これは_model_と_view_の区別の良い例です。 – trashgod

1

私はtable.convertRowIndexToModel(int ...)を使うことができると思いますが、より良い解決策があると思います。

あなた自身のconvertRowIndexToModel()を定義する場合(マップ(O(1)など)のクイックルックアップであれば、その解決策で十分です。それがO(n)なら、それは修正する必要があります。

行のループを調べて、それぞれを変換し、結果のインデックスを使用して検索します。

private Row[] getViewToModel() { 

    if (viewToModel == null) { 
     int tableModelRowCount = tableModel.getRowCount(); 

     viewToModel = new Row[tableModelRowCount]; 

     for (int row = 0; row < tableModelRowCount; row++) { 
      viewToModel[row] = new Row(row); 
     } 

     if (isSorting()) { 
      Arrays.sort(viewToModel); 
     } 
    } 

    return viewToModel; 
} 

と::ここ

は、関心のあるべきTableSorterにおける2つの方法だ

private int[] getModelToView() { 

    if (modelToView == null) { 
     int n = getViewToModel().length; 

     modelToView = new int[n]; 

     for (int i = 0; i < n; i++) { 
      modelToView[modelIndex(i)] = i; 
     } 
    } 

    return modelToView; 
} 
0

こんにちは、これは本当に遅い答えですが、@LazyCubicleMonkeyのコメントに使用されたコードを試しました。ここでは、jTableがソートされたときに行を取得するコードがあります。

DefaultTableModel search_model = (DefaultTableModel) jTable.getModel(); 
search_model.removeRow(jTable.convertRowIndexToModel(row)); 
jTable.setModel = (search_model)