如何根据排序的过滤列表向 JavaFX 中的 TableView 添加新行?

罗汉沙旺

在我的 FXMLTableViewController.java 中,我添加了一个搜索功能,它使用排序过滤列表在同一个 TableView 中显示搜索结果(过滤结果)。这段代码取自这里,这是我在我的项目中实现的。但是当我做通常的事情时它会抛出异常data2.add(new Entity(""));

public class FXMLTableViewController {

@FXML
private TableView<Entity> tableView;

@FXML
private JFXTextField searchBox;

@FXML
public void initialize() throws IOException, ParseException {
 tableView.setItems(data2); //data2 is a observable list returned my another function, it is not related here.
    FilteredList<Entity> filteredData = new FilteredList<>   (data2, p -> true);
       searchBox.textProperty().addListener((observable, oldValue,    newValue) -> {
           filteredData.setPredicate(person -> {
              if (newValue == null || newValue.isEmpty()) {
                return true;
            }

            String lowerCaseFilter = newValue.toLowerCase();
            return Person.getPsfName_add().toLowerCase().contains(lowerCaseFilter)
        });
    });
    SortedList<Entity> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(tableView.comparatorProperty());
    tableView.setItems(sortedData);
    sortedData.add(new Entity("")); //error line 
    tableView.refresh();

}

}

现在每当我尝试添加一个新的实体对象时,我都会收到错误

java.lang.UnsupportedOperationException

我猜这是因为 SortedLists 是不可修改的?我该如何解决这个问题?我想在我的项目中的各个点添加新行,但我也想要搜索/过滤工具。

詹姆斯_D

排序(和过滤)列表是不可修改的。您应该修改底层列表 ( data2),排序/过滤列表将自动更新(它正在观察底层ObservableList)。

您需要的代码如下所示:

public class FXMLTableViewController {

    @FXML
    private TableView<Entity> tableView;

    @FXML
    private JFXTextField searchBox;

    @FXML
    public void initialize() throws IOException, ParseException {

        FilteredList<Entity> filteredData = new FilteredList<>   (data2, p -> true);
        searchBox.textProperty().addListener((observable, oldValue,    newValue) -> {
            filteredData.setPredicate(person -> {
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }

                String lowerCaseFilter = newValue.toLowerCase();
                return Person.getPsfName_add().toLowerCase().contains(lowerCaseFilter)
            });
        });
        SortedList<Entity> sortedData = new SortedList<>(filteredData);
        sortedData.comparatorProperty().bind(tableView.comparatorProperty());
        tableView.setItems(sortedData);

        data2.add(new Entity("")); //error line 

    }

}

请注意,为了清楚起见,我删除了第一个调用,tableView.setItems(...)因为您只是items在之后立即设置了其他内容。另请注意,这tableView.refresh()是多余的(该表也在观察ObservableList构成其项目的 )。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章