我有一个文件系统的自定义渲染器,它根据文件,目录等呈现不同的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图标,我稍后会使用自定义图标更新这些图标)
感谢!!!