首页 > 解决方案 > JavaFX - 按列在表格视图中搜索行

问题描述

我有一个表格视图,可以按单列搜索,例如

当我有很多列并且每列必须有很多文本字段时,问题就开始了。有没有简单的方法可以使表格视图中的第一行是可编辑搜索框的行?

标签: searchjavafxtableviewrow

解决方案


如果您需要一行文本字段,每列一个,您可能需要在 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;
  });
}

希望有帮助:-)


推荐阅读