【发布时间】:2015-08-07 18:45:30
【问题描述】:
我有一个 JavaFX 应用程序,它显示特定目录的所有文件夹并监视新/删除的文件夹并更新 ListView。
现在我试图让用户使用TextField 过滤/搜索文件夹。
我以前做过,所以这是相关代码:
@Override
public void initialize(URL location, ResourceBundle resources) {
// configure other stuff
configureListView();
}
private void configureListView() {
searchField.textProperty().addListener((observable, oldVal, newVal) -> {
handleSearchOnType(observable, oldVal, newVal);
});
// more stuff here
}
private void handleSearchOnType(ObservableValue observable, String oldVal, String newVal) {
File folderToSearch = new File(config.getDlRootPath());
ObservableList<File> filteredList = FXCollections.observableArrayList(folderToSearch.listFiles(
pathname -> pathname.isDirectory() && pathname.getName().contains(newVal))); // something seems wrong here?!
if (!searchField.getText().isEmpty()) {
listView.setItems(filteredList);
} else {
// nothing to filter
listView.setItems(FXCollections.observableArrayList(
folderToSearch.listFiles(pathname -> pathname.isDirectory())));
}
}
这给了我奇怪的结果,例如:
我在这里错过了什么?
提前谢谢你!
编辑:
我的自定义细胞工厂
listView.setCellFactory(new Callback<ListView<File>, ListCell<File>>() {
@Override
public ListCell<File> call(ListView<File> list) {
return new ListCell<File>() {
@Override
protected void updateItem(File t, boolean bln) {
super.updateItem(t, bln);
if (t != null) {
setGraphic(new ImageView(new Image("img/folder.png")));
setText(t.getName());
}
}
};
}
});
【问题讨论】:
-
您可以试试
!searchField.getText().isEmpty(),而不是检查!oldVal.isEmpty()吗? -
没有修复,没有任何改变。
-
随机猜测:你们有定制的细胞工厂吗?如果是这样,你可以发布它吗? (我的直觉是你没有正确处理空单元格......)。 (顺便说一句,您可能会通过保留对过滤列表的引用并更新其谓词而不是创建新列表来获得更好的性能。)
-
我在帖子中添加了自定义单元工厂代码
-
好的,这至少是问题的一部分......它可能不是全部问题。
标签: java search javafx filefilter