2011-06-24 18 views
3

JTableにデータがあるとします。 table.getValueForCell(row、col)の呼び出しは、セルの内容を返します。これは予想通りです。JTableの行をソートする

今、テーブルを並べ替えるとします。私は、テーブルのヘッダー(列)をクリックし、テーブルを並べ替えます。 table.getValueForCell(row、col)をrowとcolと同じ値で呼び出します。テーブルがソートされているため、ここに別の行があります。ただし、table.getValueForCell(row、col)は古いデータを返します。あたかも並べ替えの際にテーブルデータを保持する基になるデータ構造が更新されていないかのようです。

これを修正する方法や、間違っていることはありますか?

答えて

2

documentation(JTable)

JTableは、もっぱら 行とそれが表示されるモデルの 列の両方を参照するために整数を使用しています。 JTableは単に表形式の セルを取り、 getValueAt(int、int)を使用して、塗装中に の値をモデルから取得します。 種々のJTableのメソッドによって返さ 列および行インデックスが JTableの(ビュー)の点であり、必ずしも モデルで使用されるのと同じインデックス ではないことを覚えておくことは重要です。ビューの 列がモデル内の列 に異なる順序で表示されるようにデフォルトで

、列はJTableの中 を再配置することができます。これは は全く モデルの実装には影響しません:列が並べ替え ている場合、JTableは内部 の列の 新しい秩序を維持し、モデルを照会 前に、その列のインデックスに変換します。

のTableModelを書くときにそう、モデルが にかかわらず ビューで何が起こっているかの独自の座標系 で照会されるように、列 イベントを並べ替えをリッスンするために 必要はありません。例エリア内の行の順序はむしろ 列の順序よりも、 変更される座標系更に別を介在させるまさにこの技術 を利用してソートアルゴリズム の実証があります。 RowSorterは にそれを処理しますむしろ、 ソートを行う方法を知っている必要はありません配下のTableModel のRowSorter が提供するソートと フィルタリング機能を使用して同様に

。 のJTableのメソッドを基にした TableModelを使用する場合、座標変換は になります。 JTablesのすべてのローベースの メソッドは、RowSorterの意味であり、 で、 のTableModelのメソッドと必ずしも同じである必要はありません。 の場合、選択は常に というJTableの用語になります。 RowSorterを使用する場合は、convertRowIndexToViewまたは convertRowIndexToModelを使用して を変換する必要があります。 以下は、基礎となる モデルのそれに JTableのからの座標を変換する方法を示しています。

また、getValueAtのJavadoc:

public Object getValueAt(int row, int column) 

は、行のセルの値を返し、 カラム。

注:列は テーブルビューの表示順序で指定され、 のTableModelの列順序では指定されません。これは の重要な違いです。 のユーザーは テーブルの列を並べ替えるため、指定されたインデックスの列は に変更されます。一方、 ユーザーの操作は、 モデルの列の順序には影響しません。

ただし、this他のStackOverflowトピックに記載されているように、テーブルラッパーを使用できます。確かにあなたが呼ばれたメソッドは、JTableに存在しないし、すでにそのトピックから来ているようです!お役に立てれば。

+0

おかげで、それはまさに私が必要とする情報です。私はモデルとその視点を見ていた。データが逆の順序でソートされるときに、convertRowIndexToView()を使用していくつかの問題がまだあります。病気はこれを調べなければなりません。しかし、私はあなたに何か面白いことを伝えます。あなたがリンクしている他の投稿は、JTableへのラッパー用です。私はちょうど私の最新バージョンにそのコードを更新しました。しかし、嬉しい人はそれを見ている、ハハ。 – user489041

+0

それは面白い!嬉しいのは、情報が役立っていて、はい、既に使用されている場合はあなたのポストを見て良いです:) – Perception

4

データは、TableModelの元の順序で常に格納されます。

table.getModel().getValueAt(...); 

表がソートされるたびに、ビューのみが変更されます。あなたがちょうど使用し、テーブルからデータを取得する場合:

table.getValueAt(...); 

もしあなたがapproriateテーブルのいずれかの方法で使用できる2つの間で前後に変換する必要があり、いくつかの理由の場合:

convertRowIndexToModel(...); 
convertRowIndexToView(...); 
+0

ありがとう、これは参考になりました。私が正しく理解しているかどうかを見てみましょう。最初にテーブルに入れたデータを必要とする場合は、table.getMode()。getValueAt()を使用します。現在テーブルに表示されているデータを必要とする場合は、table.getValueAt()を使用しますか? – user489041

+0

'table.getSelectedRows()'( 'view space'にあります)から行番号を取得するときに 'convertRowIndexToModel(...)'を必要とし、それらのインデックスを 'model space'に持つモデル、[TableRowSorter apidoc](http://docs.oracle.com/javase/6/docs/api/javax/swing/table/TableRowSorter.html)も参照してください。 –

関連する問題