1

テーブルが ( を使用して) 並べ替えモードRowSorterになっている場合、ほとんどの場合、テーブルはリアルタイムで並べ替えられているようです。たとえば、新しい行を追加するたびに、テーブルは自動的に並べ替えられます (セルの編集を除く)。このリアルタイムの並べ替え動作を無効にする方法があるかどうか疑問に思っています。

私がやりたいことは次のとおりです。テーブルを昇順または降順で並べ替えた後、ソーターは現在の並べ替え状態を維持し、リアルタイムの並べ替えを停止します。次に、新しい行を下部に追加し、選択した行を上下に移動して、テーブルがビュー モデルのすべての変更を更新します。

@trashgod: ご回答ありがとうございます。列の状態を 3 つの状態 (昇順、降順、並べ替えなし) で循環できるため、実際にはネイティブの行並べ替えメソッドのように親切です。Collections.sort を使用する場合は、毎回並べ替える前に、元の行の順序を保存する変数を作成する必要があります。

4

2 に答える 2

2

使用に関係なく、ここに示すようなカスタムTableModelの行を並べ替えることができます。カスタムは、並べ替えの方向を指定するパラメーターを受け入れることができます。RowSorterCollections.sort()Comparator

enum Sort { ASCENDING, DESCENDING; }
class RecordComparator implements Comparator<Record> {
    public RecordComparator(Sort sort, ...) { ... }
}
于 2012-05-31T23:27:52.223 に答える
0

あなたが望むのは、テーブルをソートできるようにすることですが、テーブルのソート順を変更せずに行を追加できるようにすることです。DefaultRowSorter可能ですが、 andを書き直す必要がありますTableRowSorter(両方のソースが利用可能です)。その理由は、現在の実装が一貫した並べ替え順序を維持するように設計されているためです (行がいつ追加されたかは考慮されません)。この問題を解決するために TableRowSorter を拡張することはおそらくできないでしょう。その親クラスには、今説明した設計に結び付けられた多くのプライベート関数があるからです。

上で説明したのはクリーンな方法です。これを行う別の方法を次に示します。新しい行を挿入するたびにこれを行います。

  1. ビューの現在の並べ替え順序をマップに保存します。ハッシュマップ ( postion) を使用して、並べ替え列の行 i の各オブジェクトをビュー内の位置にマップしました。 position.put(tableModel.getValueAt(i, column), sorter.convertRowIndexToView(i));

  2. 上記で作成したマップを使用して受信データをソートするコンパレータを作成します。TableRowSorter の列コンパレータを、新しく作成したコンパレータに設定します。次に、 を呼び出します。これは、コンパレータをキャッシュする必要sorter.sort()があるため必要です。DefaultRowSorterコンパレーターは、既存のオブジェクトを現在の位置に配置し、新しいオブジェクト (挿入中に作成された) を最後に配置します。

  3. テーブル モデルへの行の挿入を実行します。私のコードでは、3 つのランダムな Integer、Boolean、Double 値をテーブルの 3 つの列に追加します。

  4. 値を 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);
    }
}
于 2012-06-01T08:23:55.970 に答える