如何根据已排序的过滤列表向 JavaFX 中的 TableView 添加新行?
How to add new Rows to TableView in JavaFX, based on a sorted filtered List?
在我的 FXMLTableViewController.java 中,我添加了一个搜索功能,它使用排序过滤列表在同一个 TableView 中显示搜索结果(过滤结果)。这段代码取自 here 这是我在我的项目中实现的。但是当我执行通常的 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 是不可修改的?我该如何解决这个问题?我想在我的项目中的不同点添加新行,但我也想要 Search/Filter 工具。
排序(和过滤)的列表是不可修改的。您应该修改底层列表(data2
),sorted/filtered列表将自动更新(它正在观察底层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()
是多余的(table 也在观察构成其项目的 ObservableList
)。
在我的 FXMLTableViewController.java 中,我添加了一个搜索功能,它使用排序过滤列表在同一个 TableView 中显示搜索结果(过滤结果)。这段代码取自 here 这是我在我的项目中实现的。但是当我执行通常的 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 是不可修改的?我该如何解决这个问题?我想在我的项目中的不同点添加新行,但我也想要 Search/Filter 工具。
排序(和过滤)的列表是不可修改的。您应该修改底层列表(data2
),sorted/filtered列表将自动更新(它正在观察底层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()
是多余的(table 也在观察构成其项目的 ObservableList
)。