【问题标题】:Java ExplorerManager FilterJava ExplorerManager 过滤器
【发布时间】:2019-01-31 03:19:24
【问题描述】:

我已实现 https://blogs.oracle.com/geertjan/file-browser 以仅显示文件夹(将 accept() 中的 == 更改为 !=)。但是,无论我做了什么,它只调用第一级的 FileFilterNodeChildren,即根节点的子节点。所以我得到的是根节点的文件夹(我想要的目录),但它显示了这个级别以下的所有文件和文件夹。我已经放入了验证过滤器函数仅在第一级调用的语句。

过滤第一级及以下的孩子需要做什么?

【问题讨论】:

  • 我不太确定我是否了解您的需求。您只想查看第一级的文件夹吗?您只想查看任何级别的文件夹吗?你有没有用调试器单步调试你的代码,看看哪里出错了?这通常是了解您复制的代码的最佳方式。
  • 我只想查看文件夹,无论级别如何。我不想在此资源管理器中看到任何文件。
  • 请注意,正在使用的类(例如DataFolder)是不是基本的 JDK 类,因此我无法帮助您了解该库的细节。但是,如果您检查 `node.getLookup().lookup(DataFolder.class) != null`,这似乎与“它是一个文件夹”不同。您需要阅读 lookup 正在做什么,以更好地了解正在发生的事情。从长远来看,只是复制粘贴对您没有帮助。
  • 回复Thomas:我在accept函数上放了一个断点。对于第一级(根目录以下)的四个目录,accept 函数被调用两次。也就是说,为四个目录中的每一个调用accept(),然后为这四个目录中的每一个再次调用它。第一级目录下的任何文件或目录都不会调用它。我为每个 node.getDisplayName() 添加了一个 System.out.print,这样我就可以知道它被调用了哪些目录。

标签: java netbeans netbeans-platform filefilter


【解决方案1】:

在 createNodes() 内部,您需要使用 FileFilterNode 的实例包装子节点。这是 createNodes() 的修订版:

@Override
protected Node[] createNodes(Node object) {
    List<Node> result = new ArrayList<Node>();
    for (Node node : super.createNodes(object)) {
        if (accept(node)) {
            // This is the only changed line
            result.add(new FileFilterNode(node));
        }
    }
    return result.toArray(new Node[0]);
}

这已在 Windows 上的 NetBeans 8.2 中进行了测试,并按预期工作。 “文件浏览器”显示一个只包含所有级别文件夹的树。

【讨论】:

  • 好的,这可以为第一级以下的节点调用过滤器。但是,当我尝试过滤掉非目录节点(即:文件)时,它会导致其他问题。这些问题很难描述,体验更好。我将使用 jtree 而不是 bean 树,因为它允许我构建树而不是构建树。感谢大家的帮助。
  • 我刚才在 Windows 上使用 NetBeans 8.2 对其进行了测试,它似乎工作正常。我很好奇其他问题是什么。
  • 我刚刚使用 NetBeans 9.0.1 在 Linux 上对其进行了测试。当我展开最终目录时,它“默默地”抛出异常。 (即:我在调试器中看到异常信息,但在 GUI 中看不到。)在所有其他人展开它时,我看到每个过滤掉的文件都有一个“空白”文档,在调试器中为每个和这些文件中的每一个,然后当它完成时(因为抛出异常需要时间),“空白”文档消失并且树出现我期望的样子。 “空白”是指文档图标不显示名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多