javafx TableView:为什么我对降序排序时不触发sortOrder侦听器?

时间:2018-09-10 09:50:02

标签: javafx observable javafx-tableview

我有一个javafx TableView,我想知道列的排序顺序何时更改。我向getSortOrder方法添加了一个侦听器。但是,只有在对升序进行排序时才会触发,而对降序进行排序时则不会触发。 为了测试这一点,我使用了example code 有谁知道为什么不触发?我还需要添加其他东西吗?

表中的数据位于SortedList中,我如下添加了侦听器:

personTable.getSortOrder().addListener(this::onColumnSortOrderChanged);

 private void onColumnSortOrderChanged(ListChangeListener.Change<? extends TableColumn<Person, ?>> change) {
    boolean changed = false;
    while (change.next()) {
        changed = true;
    }
    if (changed) {
        if (change.getList().isEmpty()) {
            System.out.println("observable is empty");
        } else {
            TableColumn<Person, ?> column = change.getList().get(0);
            System.out.println("Sorted: " + column.getText() + " sort type " + column.getSortType());
        }
    }
}

1 个答案:

答案 0 :(得分:2)

可以使用多列进行排序(例如,首先按姓氏对人进行排序,然后使用给定名称作为次要条件)。您可以按住 Shift 添加多个列。如果要在列的升序和降序之间进行更改,则此列表不会更改。

要收听这些更改,您还需要收听TableColumn.sortType属性。

// print sort order on change
table.getSortOrder().addListener((Observable o) -> {
    System.out.println("sort order: "+ table.getSortOrder().stream().map(TableColumn::getText).collect(Collectors.joining(", ", "{", "}")));
});

// print sortType on change
column.sortTypeProperty().addListener(o -> System.out.println("sortType changed to: " + column.getSortType()));