search - JavaFX - 按列在表格视图中搜索行
解决方案
如果您需要一行文本字段,每列一个,您可能需要在 TableView 上方放置一个 HBox 容器,并将 TextField 实例放入 HBox。为了获得正确的大小,您可以将文本字段(首选!)宽度绑定到相应的列宽度,并将 HBox(首选!)宽度绑定到 TableView 宽度:
hbox.prefWidthProperty().bind(tableview.widthProperty());
textfield1.prefWidthProperty().bind(col1.widthProperty());
textfield2.prefWidthProperty().bind(col2.widthProperty());
一种非常简单但有效的过滤方法是将 TableView 数据包装在 FilteredList 中,如果其中一个搜索框中的文本发生更改,则更新过滤谓词:
ObservableList<Person> data = FXCollections.observableArrayList();
data.add(....); // add data ...
// wrap the data collection in a filterd list:
filteredList = new FilteredList<>(data);
filteredList.setPredicate(p -> true); // Initial: show all rows
// set the FilteredList as TableView data:
tableview.itemsProperty().set(filteredList);
// Create a changelistener for the search box:
// "dataObject" is an instance of your data class/entity etc.
textfield1.textProperty().addListener((observable, oldValue, newValue) -> {
updatePredicate();
});
textfield2.textProperty().addListener((observable, oldValue, newValue) -> {
updatePredicate();
});
如果您的列不适合 TabelView 的视口,那么您可能希望将搜索框放在列标题中,即将 TextFields 设置为 TableColumn 的图形属性:
col1.setGraphic(textfield1);
col2.setGraphic(textfield2);
起初,图形节点会隐藏列标题。您可以尝试通过 css 样式来更正此问题(只是一个提示,我需要检查一下),或者您将一个新标签与 HBox 中的文本字段一起打包,该 HBox 将成为列标题图形节点。
更新过滤谓词的方法:
private void updatePredicate() {
filteredList.setPredicate((data) -> {
boolean showItem = true;
if (!textfield1.getText().isEmpty()) {
showItem = showItem && (data.getField1().contains(textfield1.getText()));
}
if (!textfield2.getText().isEmpty()) {
showItem = showItem && (data.getField2().contains(textfield2.getText()));
}
return showItem;
});
}
希望有帮助:-)
推荐阅读
- lua - Lua:摆脱部分路径(sub,gsub,gmatch?)
- maven - 如何使用 Maven Jib 插件使主机文件在容器内可用
- python - pytype 和 mypy 都没有抱怨类型错误?
- c++ - 只找到第一个 std::regex 匹配有效
- python - 在 Python 中使用 tensorflow 填充一个权重的张量
- sql - SSMS - 将长数据导出到 Excel 文件而不截断数据
- sql - SSMS 按日期时间字段过滤数据
- java - 当开发工具重新启动 Web 服务器时,计划任务不会停止
- angularjs - 尝试多次加载 AngularJS(从 1.5 升级到 1.7 后)
- sql-server - 带有日期帮助的 T-SQL SELECT 查询