【问题标题】:Java 8 SortedList TableView not refreshingJava 8 SortedList TableView 不刷新
【发布时间】:2014-02-05 23:02:23
【问题描述】:

我正在使用 TableView 来可视化由 ObservableList 备份的 SortedList。

SortedList 的比较器绑定到 TableView 的比较器:

sortedList().comparatorProperty().bind(tableView.comparatorProperty());

当我将项目添加到底层 ObservableList 时,SortedList 会按预期排序(通过所选 TableView 的比较器)。

虽然当我更改 ObservableList 的属性(使用 CheckBoxTableCell,但这不重要)时,SortedList 不会再次排序。

这应该有效还是我必须找到解决方法?

我正在使用 jdk 8 b121。

【问题讨论】:

  • "TableView 的比较器绑定到 SortedList 的比较器" => 不相反。您使用排序列表是否有原因?我希望表视图的排序在项目列表发生变异(添加/删除)时“刷新”,但在项目本身发生变异时不会。因此,您可能需要在复选框上添加一个侦听器并以编程方式重新排序表格。
  • 我使用 SortedList 主要是因为它是新的并且认为它会更有效的排序。但是 SortedList 不能手动排序(可能有一种解决方法),所以我切换到显示 ObservableList 并且它可以工作(我必须在每次更改时调用 FXCollections.sort())
  • 其实我还得为.compareTo()函数手动获取TableView的Comparator,但是现在可以了!
  • @LukasLeitinger 你应该在你的解决方案中添加一个答案并接受它

标签: java javafx javafx-8 java-8 sortedlist


【解决方案1】:

注意:此答案假定“更改 ObservableList 的属性”实际上应该读作“更改 ObservableList 项的属性”。如果假设不正确,我会删除。

SortedList 是 TableView 中可排序数据的干净解决方案 - 它的设计和实现是为了在包装列表更改时保持自身排序。前提是,后备列表通知其听众有关更改。这不需要额外的客户端代码来修改列表(如添加/删除/项目集)。

另一方面,它没有通用的方法可以知道对包含项目的属性的修改:客户端代码必须提供一个提取器(也称为回调,返回一个 Observables 数组),它允许列表触发更新事件以它的听众。

一个示例(Person 一个具有明显属性的演示 bean - 替换为您最喜欢的示例 bean),编辑按钮只是在所选人员的姓氏前加上一个“z”。

public class TableViewSortSample extends Application {

    private Parent getContent() {
        // wrap the backing list into an observableList with an extractor
        ObservableList<Person> persons = FXCollections.observableList(
                Person.persons(),
                person -> new Observable[] {person.lastNameProperty(), person.firstNameProperty()}            
        );
        // wrap the observableList into a sortedList
        SortedList<Person> sortedPersons = new SortedList<>(persons);
        // set the sorted list as items to a tableView
        TableView<Person> table = new TableView<>(sortedPersons);
        // bind the comparator of the sorted list to the table's comparator
        sortedPersons.comparatorProperty().bind(table.comparatorProperty());
        TableColumn<Person, String> firstName = new TableColumn<>("First Name");
        firstName.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        TableColumn<Person, String> lastName = new TableColumn<>("Last Name");
        lastName.setCellValueFactory(new PropertyValueFactory<>("lastName"));
        table.getColumns().addAll(firstName, lastName);
        Button edit = new Button("Edit");
        edit.setOnAction(e -> {
            Person person = table.getSelectionModel().getSelectedItem();
            if (person != null) {
                person.setLastName("z" + person.getLastName());
            }
        });
        VBox pane = new VBox(table, edit);
        return pane;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(getContent()));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多