【问题标题】:JavaFX filter ListView File elements using FileFilterJavaFX 使用 FileFilter 过滤 ListView 文件元素
【发布时间】: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


【解决方案1】:

不确定这是否是唯一的错误,但您的自定义单元工厂需要处理单元为空的情况:

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) 将在这些单元格上调用,然后需要清除其所有内容(否则它们只会保留之前的内容)。

(作为奖励,我还稍微进行了重构,这样您就不会在每次用户滚动列表视图时都从每个单元格中的图像文件中加载图像。)

【讨论】:

  • 太棒了!这是唯一的问题,现在它可以正常工作了。谢谢
猜你喜欢
  • 2021-04-06
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2016-04-28
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多