TreeView に関連付けられた TableView があります。TreeView のノードが選択されるたびに、TableView は異なるデータで更新されます。
対応する列ヘッダーを押すだけで、TableView の任意の列を並べ替えることができます。それはうまくいきます。
しかし、ツリービューで別のノードを選択すると、列ヘッダーがソートされたまま表示されます。データはそうではありません。
データが変更されるたびにユーザーが行った並べ替え順序をプログラムで強制する方法はありますか?
わかりました、私はそれを行う方法を見つけました。他の人に役立つ場合に備えて、ここで要約します。
TableView の内容を更新する前に、sortcolum (存在する場合) と sortType を保存する必要があります。
TableView rooms;
...
TableColumn sortcolumn = null;
SortType st = null;
if (rooms.getSortOrder().size()>0) {
sortcolumn = (TableColumn) rooms.getSortOrder().get(0);
st = sortcolumn.getSortType();
}
次に、 TableView 内のデータの更新が完了したら、失われた並べ替え列の状態を復元し、並べ替えを実行する必要があります。
if (sortcolumn!=null) {
rooms.getSortOrder().add(sortcolumn);
sortcolumn.setSortType(st);
sortcolumn.setSortable(true); // This performs a sort
}
並べ替えに複数の列が含まれる可能性は考慮していませんが、この情報を使用するのは非常に簡単です。
TableView が再初期化されていない場合は、次のこともできます。
TableColumn<BundleRow, ?> sortOrder = rooms.getSortOrder().get(0);
rooms.getSortOrder().clear();
rooms.getSortOrder().add(sortOrder);
fornacifの例は機能しますが、複数の並べ替え順序がある場合は機能しません (2 番目の列を Shift キーを押しながらクリックして、2 番目の並べ替え順序を作成してみてください)。
すべての列を再ソートするには、次のようにする必要があります。
List<TableColumn<Room, ?>> sortOrder = new ArrayList<>(roomTable.getSortOrder());
roomTable.getSortOrder().clear();
roomTable.getSortOrder().addAll(sortOrder);
Marco Jakob の回答はほとんどの場合に適していますが、柔軟性を高めるには、テーブルの並べ替え順序に一致するコンパレータを作成する必要があることがわかりました。次に、コンパレータを使用して並べ替えや検索などを行う任意のメソッドを使用できます。コンパレータを作成するために、 Apache の Common-Collections からComparatorChainクラスを拡張して、複数の列の並べ替えを簡単に実行できるようにしました。このように見えます。
public class TableColumnListComparator extends ComparatorChain {
public TableColumnListComparator(ObservableList<? extends TableColumn> columns) {
// Get list of comparators from column list.
for (TableColumn column : columns) {
addComparator(new ColumnComparator(column));
}
}
/**
* Compares two items in a table column as if they were being sorted in the TableView.
*/
private static class ColumnComparator implements Comparator {
private final TableColumn column;
/**
* Default Constructor. Creates comparator based off given table column sort order.
*
* @param column
*/
public ColumnComparator(TableColumn column) {
this.column = column;
}
@Override
public int compare(Object o1, Object o2) {
// Could not find a way to do this without casts unfortunately
// Get the value of the column using the column's cell value factory.
final ObservableValue<?> obj1 = (ObservableValue) column.getCellValueFactory().call(
new TableColumn.CellDataFeatures(column.getTableView(), column, o1));
final ObservableValue<?> obj2 = (ObservableValue) column.getCellValueFactory().call(
new TableColumn.CellDataFeatures(column.getTableView(), column, o2));
// Compare the column values using the column's given comparator.
final int compare = column.getComparator().compare(obj1.getValue(), obj2.getValue());
// Sort by proper ascending or descending.
return column.getSortType() == TableColumn.SortType.ASCENDING ? compare : -compare;
}
}
}
その後、いつでも並べ替えることができます
Collections.sort(backingList, new TalbeColumnListComparator(table.getSortOrder());
これを使用して、複数のリストを同じソートでソートしたり、バックグラウンド スレッドでソートしたり、リスト全体を再ソートせずに効率的な更新を行ったりします。将来。