JavaFX 使用 FileFilter 过滤 ListView 文件元素
JavaFX filter ListView File elements using FileFilter
我有 JavaFX 应用程序,它显示特定目录的所有文件夹并监视 new/deleted 文件夹并更新 ListView
。
现在我试图让用户 filter/search 使用 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());
}
}
};
}
});
不确定这是否是唯一的错误,但您的自定义单元格工厂需要处理单元格为空的情况:
final Image image = new Image("img/folder.png");
listView.setCellFactory(new Callback<ListView<File>, ListCell<File>>() {
@Override
public ListCell<File> call(ListView<File> list) {
return new ListCell<File>() {
private final ImageView imageView = new ImageView(image);
@Override
protected void updateItem(File t, boolean bln) {
super.updateItem(t, bln);
if (t == null) {
setGraphic(null);
setText(null);
} else {
setGraphic(imageView);
setText(t.getName());
}
}
};
}
});
这里的重点是当你开始过滤时,一些以前不为空的单元格会变成空的。 updateItem(null, true)
将在这些单元格上调用,然后需要清除所有内容(否则它们只会保留之前的内容)。
(作为奖励,我还进行了轻微重构,这样您就不会在每次用户滚动列表视图时都从图像文件中加载图像。)
我有 JavaFX 应用程序,它显示特定目录的所有文件夹并监视 new/deleted 文件夹并更新 ListView
。
现在我试图让用户 filter/search 使用 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());
}
}
};
}
});
不确定这是否是唯一的错误,但您的自定义单元格工厂需要处理单元格为空的情况:
final Image image = new Image("img/folder.png");
listView.setCellFactory(new Callback<ListView<File>, ListCell<File>>() {
@Override
public ListCell<File> call(ListView<File> list) {
return new ListCell<File>() {
private final ImageView imageView = new ImageView(image);
@Override
protected void updateItem(File t, boolean bln) {
super.updateItem(t, bln);
if (t == null) {
setGraphic(null);
setText(null);
} else {
setGraphic(imageView);
setText(t.getName());
}
}
};
}
});
这里的重点是当你开始过滤时,一些以前不为空的单元格会变成空的。 updateItem(null, true)
将在这些单元格上调用,然后需要清除所有内容(否则它们只会保留之前的内容)。
(作为奖励,我还进行了轻微重构,这样您就不会在每次用户滚动列表视图时都从图像文件中加载图像。)