4

デフォルトのソート機能を取得する単純なTableView(Java FX 2.0ですが、問題はかなり一般的だと思います)があります。ただし、テーブルの最後の行に合計があるため、最後の行を並べ替えアルゴリズムから除外したいと思います。

合計行用に別のテーブルを作成することで構成される Swing JTable の解決策を見つけました。これは TableView に転置可能ですが、少し面倒です。独自の Comparator を実装しようとしましたが、昇順と降順の両方で機能するものを作成することはできないと思います。

4

3 に答える 3

5

JavaFX 8 では、並べ替えポリシーを定義することが可能であり、問​​題の修正が容易になっています。合計を含む行を次のように仮定しますTOTAL

table.sortPolicyProperty().set(t -> {
    Comparator<Row> comparator = (r1, r2) -> 
         r1 == TOTAL ? 1 //TOTAL at the bottom
       : r2 == TOTAL ? -1 //TOTAL at the bottom
       : t.getComparator() == null ? 0 //no column sorted: don't change order
       : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly
    FXCollections.sort(t.getItems(), comparator);
    return true;
});
于 2014-01-13T20:53:53.203 に答える
3

lolsvemir の回答に基づいて、カスタム Comparator を使用して「TOTAL」を正常に実装しました。列の sortTypeProperty でコンパレータを設定します。 col.setComparator(new BigDecimalColumnComparator(col.sortTypeProperty()));

カスタム コンパレータ:

public class BigDecimalColumnComparator implements Comparator<BigDecimal> {
    private final ObjectProperty<TableColumn.SortType> sortTypeProperty;

    public BigDecimalColumnComparator(ObjectProperty<TableColumn.SortType> sortTypeProperty) {
        this.sortTypeProperty = sortTypeProperty;
    }

    @Override
    public int compare(BigDecimal o1, BigDecimal o2) {
        TableColumn.SortType sortType = sortTypeProperty.get();
        if (sortType == null) {
            return 0;
        }

        if (o1 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return 1;
            } else {
                return -1;
            }
        } else if (o2 instanceof TotalBigDecimal) {
            if (sortType == TableColumn.SortType.ASCENDING) {
                return -1;
            } else {
                return 1;
            }
        }

        return o1.compareTo(o2);
    }
}
于 2013-03-11T18:03:49.590 に答える