我想编写一个方法,在该方法中传递textfield(filterField)、来自tableview(data)和tableview(table)的数据,以便筛选所有表数据,每次在textfield中释放键时,都会检查键入的字符串是否包含在表的任何单元格中。
为此,我使用以下代码:
public void addTextFilter(ObservableList<List<Object>> allData,
JFXTextField filterField, TableView<List<Object>> table) {
FilteredList<List<Object>> filteredData = new FilteredList<>(allData, p -> true);
filterField.setOnKeyReleased(e ->
{
filteredData.setPredicate(p ->
{
if (filterField.getText() == null || filterField.getText().isEmpty()){
return true;
}else {
return p.contains(filterField.getText());
}
});
});
SortedList<List<Object>> sortedData = new SortedList<>(filteredData);
sortedData.comparatorProperty().bind(table.comparatorProperty());
table.setItems(sortedData);
}
此代码仅在textfield中的字符串与表中任何单元格的值完全匹配时返回值。
我将需要它返回表中包含键入字符串的任何单元格,即使该单元格包含更多字符。类似于以下内容:JavaFX8TableView排序和过滤
您应该监听text
属性中的更改,而不是使用KeyEvent
。
TableColumn
s可用于检索可在谓词中使用的单元格的值。
public static <T> void addTextFilter(ObservableList<T> allData,
JFXTextField filterField, TableView<T> table) {
final List<TableColumn<T, ?>> columns = table.getColumns();
FilteredList<T> filteredData = new FilteredList<>(allData);
filteredData.predicateProperty().bind(Bindings.createObjectBinding(() -> {
String text = filterField.getText();
if (text == null || text.isEmpty()) {
return null;
}
final String filterText = text.toLowerCase();
return o -> {
for (TableColumn<T, ?> col : columns) {
ObservableValue<?> observable = col.getCellObservableValue(o);
if (observable != null) {
Object value = observable.getValue();
if (value != null && value.toString().toLowerCase().equals(filterText)) {
return true;
}
}
}
return false;
};
}, filterField.textProperty()));
SortedList<T> sortedData = new SortedList<>(filteredData);
sortedData.comparatorProperty().bind(table.comparatorProperty());
table.setItems(sortedData);
}
如果您的列包含列表的值,则可以稍微简化代码:
public static void addTextFilter(ObservableList<List<Object>> allData,
JFXTextField filterField, TableView<List<Object>> table) {
final List<TableColumn<List<Object>, ?>> columns = table.getColumns();
FilteredList<List<Object>> filteredData = new FilteredList<>(allData);
filteredData.predicateProperty().bind(Bindings.createObjectBinding(() -> {
String text = filterField.getText();
if (text == null || text.isEmpty()) {
return null;
}
final String filterText = text.toLowerCase();
return o -> {
for (Object value : columns) {
if (value != null && value.toString().toLowerCase().equals(filterText)) {
return true;
}
}
return false;
};
}, filterField.textProperty()));
SortedList<List<Object>> sortedData = new SortedList<>(filteredData);
sortedData.comparatorProperty().bind(table.comparatorProperty());
table.setItems(sortedData);
}
请注意,上面的代码段都没有被告知对项所做的更改。
我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA
首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数
应用筛选器之前的示例使用者记录是(在值中查找GP_ID): 当我在kafkaListenerContainerFactory()中按如下方式设置recordFilterStrategy时: KafKareCordvo.ConvertByteBufferToLong正在将bytebuffer值转换为long值。 但是,当它被Kafka听众按以下方式消费时: 这将返回删除我筛选的字段值的记录:“gp_
“{”error“:{”root_case“:[{”type“:”parsing_exception“,”reason“:”[match_all]格式错误的查询,预期[END_OBJECT]但找到[FIELD_NAME]“,”line“:”line“:1,”col“:26}”,“status”:400}“,”type“:”parsing_exception“,”reason“:”[match_al
我的页面中有一个名为“search_table”的DataTable。我在表中有一个附加的标题行,它具有不同的筛选选项(dropdown、text、date_pickers)。对于日期列,我有两个datepicker,一个用于min,一个用于max。我可以根据datepickers为datatable筛选数据,但有一个问题: 当我选择一个日期时,我的表中的所有行都消失了,我必须点击其中的一个标题(
我有一个带有FireBaseRecyclerAdapter的RecyclerView。当用户开始输入SearchView时,我想用一个名称列表填充RecycerView。 也是对查询进行忽略的方法吗?