JTree使用自定义渲染器将一些非叶节点渲染为叶子

时间:2017-05-12 05:09:58

标签: java swing jtree

我有一个文件系统的自定义渲染器,它根据文件,目录等呈现不同的JTree节点。它适用于除少数目录之外的所有节点。对于这些目录,它将节点的图标呈现为叶节点,即使它们是目录。

这是自定义渲染器的代码:

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
                                                  boolean leaf, int row, boolean hasFocus)
    {
        Component treeCellRendererComponent = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

        tree.putClientProperty("Tree.paintLines", Boolean.TRUE);

        if (value instanceof FileNode)
        {
            FileNode fileNode = (FileNode) value;
            if (fileNode.isRoot()) { setIcon(UIManager.getIcon("FileView.computerIcon")); }
            else if (fileNode.isDrive()) { setIcon(UIManager.getIcon("FileView.hardDriveIcon")); }
            else if (fileNode.getAllowsChildren() && fileNode.getFile().isHidden())
            {
                setIcon(MyIcons.folderHiddenIcon());
            }
            else if (fileNode.getAllowsChildren())
            {
                TreePath treePath = Utilities.getTreePath(fileNode);
                if (tree.isExpanded(treePath)) { setOpenIcon(MyIcons.folderOpenIcon()); }
                else { setClosedIcon(MyIcons.folderClosedIcon()); }
            }
            else { setLeafIcon(MyIcons.fileIcon()); }
        }

        return treeCellRendererComponent;
    }
}

这是getAllowsChildren()

的自定义代码
@Override
public boolean getAllowsChildren()
{
    if (getFile() != null) return getFile().isDirectory() || isDrive;
    else return super.getAllowsChildren();
}

FileNode会覆盖DefaultMutableTreeNode

我的Windows 10系统上有几个目录仍然像叶节点一样呈现,例如一个名为“PerfLogs”的目录 - 我用断点验证了代码知道PerfLogs是一个非hiddren目录(尽管它是空)。

有人可以解释为什么这个目录仍然呈现为叶节点?

(PS - 我并不担心root和驱动器的两个硬编码UI图标,我稍后会使用自定义图标更新这些图标)

感谢!!!

0 个答案:

没有答案