あなたが望むのは、テーブルをソートできるようにすることですが、テーブルのソート順を変更せずに行を追加できるようにすることです。DefaultRowSorter
可能ですが、 andを書き直す必要がありますTableRowSorter
(両方のソースが利用可能です)。その理由は、現在の実装が一貫した並べ替え順序を維持するように設計されているためです (行がいつ追加されたかは考慮されません)。この問題を解決するために TableRowSorter を拡張することはおそらくできないでしょう。その親クラスには、今説明した設計に結び付けられた多くのプライベート関数があるからです。
上で説明したのはクリーンな方法です。これを行う別の方法を次に示します。新しい行を挿入するたびにこれを行います。
ビューの現在の並べ替え順序をマップに保存します。ハッシュマップ ( postion
) を使用して、並べ替え列の行 i の各オブジェクトをビュー内の位置にマップしました。 position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));
上記で作成したマップを使用して受信データをソートするコンパレータを作成します。TableRowSorter の列コンパレータを、新しく作成したコンパレータに設定します。次に、 を呼び出します。これは、コンパレータをキャッシュする必要sorter.sort()
があるため必要です。DefaultRowSorter
コンパレーターは、既存のオブジェクトを現在の位置に配置し、新しいオブジェクト (挿入中に作成された) を最後に配置します。
テーブル モデルへの行の挿入を実行します。私のコードでは、3 つのランダムな Integer、Boolean、Double 値をテーブルの 3 つの列に追加します。
値を null に設定して、#3 で追加されたコンパレータを削除します。sorter.setComparator(sortKeys.get(0).getColumn(), null);
この方法では、次に列で並べ替えが切り替えられたときに、ダミーのコンパレータではなくデフォルトのコンパレータが使用されます。
完全なコードは以下のとおりです。ボタンが押されるたびにテーブルに行を追加することを目的としています。sortkeys > 1 またはフィルターでこれをテストしていないことに注意してください (それはあなたに任せます)。このハックについてどう思うか教えてください。
private void insertRowButtonActionPerformed(java.awt.event.ActionEvent evt) {
TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>)jTable1.getRowSorter();
final HashMap<Object, Integer> position = new HashMap<Object, Integer>();
List<? extends SortKey> sortKeys = sorter.getSortKeys();
if(!sortKeys.isEmpty()){
SortKey sortKey = sortKeys.get(0);
int column = sortKey.getColumn();
TableModel tableModel = sorter.getModel();
int n = sorter.getModelRowCount();
final SortOrder sortOrder = sortKey.getSortOrder();
for(int i=0;i<n;i++){
position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));
}
//add dummy comparator
sorter.setComparator(column, new Comparator<Object>(){
public int compare(Object o1, Object o2) {
int obj1Position = position.containsKey(o1) ? position.get(o1):position.size();
int obj2Position = position.containsKey(o2) ? position.get(o2):position.size();
return sortOrder == SortOrder.DESCENDING ? obj2Position - obj1Position:obj1Position - obj2Position;
}
});
sorter.sort();
}
/////////////insert row///////////////////
DefaultTableModel tableModel = (DefaultTableModel)jTable1.getModel();
tableModel.addRow(new Object[]{rand.nextInt(), rand.nextBoolean(), rand.nextDouble()});
/////////////end insert row///////////////
//remove dummy comparator
if(!sortKeys.isEmpty()){
sorter.setComparator(sortKeys.get(0).getColumn(), null);
}
}