2

TableRowSorter/DefaultRowSorter が提供するものとは異なる挿入動作を持つ JTable が必要です。

ユーザーが行を挿入すると、新しく挿入された行がカーソルがあった行の下に移動し、カーソルが新しく挿入された行に配置されるようなテーブルが必要です。例を挙げて説明しましょう。

初期状態 - テーブルには 4 つの行があります:

0. Row 1
1. Row 2 <-- cursor here
2. Row 3
3. Row 4

ユーザーのカーソルは 2 行目にあり、ユーザーは挿入をトリガーします。新しく挿入された行が下に表示され、カーソルもそこに移動します。

0. Row 1
1. Row 2 
2. New row <-- cursor here
3. Row 3
4. Row 4

この問題を解決するには2つのアプローチがあることをよく理解しています。

最初のアプローチは、モデルを変更することです。そのため、挿入はモデルの適切な場所で行われます。挿入された行の下のすべての行でモデルのインデックスが変更されることを意味するため、このソリューションは好きではありません。これは私が必要とすることを達成するための最も簡単な方法ですが、モデル インデックスの変更によって大きなオーバーヘッドが発生する可能性があります...

2 番目のアプローチは、独自の videoToModel[] および modelToView[] 配列を維持し、行が挿入されたときに正しい順序を維持する RowSorter を実装することです。当然、私は TableRowSorter を拡張することから始めましたが、問題は modelToView と viewToModel がプライベート配列であり、それらにアクセスできないため、行がフィルター処理されたときに問題が発生することです...

正しく行うには時間がかかるため、独自の RowSorter 実装を作成しないようにしています...

UPDATE 2013-10-07: 独自の RowSorter を実装することでこれを達成しました。両方のアプローチを試した後、2 番目のアプローチの方が柔軟性が高いことに気付きました。

4

2 に答える 2

1

RowSorter を使用して正しくソートする JTable を取得する「正しい」方法は、オーバーライドすることAbstractTableModel.getColumnClass(int)です。DefaultRowSorter.setSortKeys()次に、呼び出して並べ替え順序を指定できます。

これらのメソッドを使用すると、モデルに任意の順序で行を追加/削除でき、「正しい」並べ替え順序で表示されることに満足できます。

compareTo()特別な並べ替え、つまりオブジェクトのメソッド以外に基づく並べ替えが必要な場合は、呼び出しDefaultRowSorter.setComparator()て、その列で動作する独自の比較関数を提供できます。

「カーソル」が何を意味するのかわかりませんが、新しく挿入された行を選択する必要があることを意味する場合は、ビュー インデックスJTable.setRowSelectionInterval()を取る を呼び出すことで実現されるため、変換する必要があります (たとえば、モデルを変換するインデックス (おそらく、挿入したモデルの最後の行) をビュー インデックスに追加します)。

于 2012-04-30T13:10:45.687 に答える
1

元の回答を編集する必要があったかどうかはわかりませんが、今では完全に間違っていると思います。

あなたの最初の解決策が最善だと思います。テーブルモデルにデータを挿入するのにコストがかかることを心配することはありませんが、それを直接見るまで (または、数十万行または何かがあることを知っている場合)。

だから - このようなものは私が行くものです:

int modelIndex = table.convertRowIndexToModel(table.getSelectedRow());
tableModel.insertRow(modelIndex, myRowVector);

コードをちらりとDefaultTableModel見ると、これはかなり高速な方法のように見えますが、おそらくVector.insertElementAt()オーバーヘッドを回避する方法はありません... a をまったく使用するよりも全体的にオーバーヘッドが低いと確信していRowSorterます。

于 2012-04-30T13:43:14.407 に答える