我正在制作一个程序,向我显示客户端计算机的文件和目录,而我通过使用JTree来做到这一点。当客户端向我发送目录和文件(如果是目录)时,我将创建一个节点并添加一个子节点,显示“正在加载”(除非他们单击该链接,否则该链接不可见,然后要求客户端提供下一组)文件/目录)。这样,我可以轻松地查看什么是文件,什么不是。
当我在C:/
上运行它时,效果很好。但是,当我尝试单击C:/
内的文件夹(如C:/Users
)时,我得到了这些文件夹,但随后使Users
节点成为文件节点,然后添加了子目录到C:/
分支。像这样:
我可以解释Users
文件夹成为文件(某种程度上)的原因,因为当它从客户端加载新文件时,从其中删除了“ Loading ...”子节点,但是它仍然没有解释为什么不将新节点添加到Users
节点。这是执行此操作的代码行:nodes.get(nodes.indexOf(node)).add(thisDirectory);
nodes
是一个ArrayList
,树中有每个节点。 node
是当前节点(在这种情况下为User
),而thisDirectory
是子节点(与Bill
类似)。这是用于更多上下文的整个功能:
// Add a directory node to array and JTree under previous node
private static void addDirectorySubfolder(String[] data, Boolean[] isDirectory, DefaultMutableTreeNode node) {
for (int i = 0; i < data.length; i++) {
DefaultMutableTreeNode thisDirectory = new DefaultMutableTreeNode(data[i]);
if (isDirectory[i]) {
thisDirectory.add(new DefaultMutableTreeNode("Loading..."));
nodeDetails.add(true);
}
else
nodeDetails.add(false);
nodes.get(nodes.indexOf(node)).add(thisDirectory);
nodes.get(nodes.indexOf(node)).remove(0);
// Add node into tree
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
root.add(thisDirectory);
model.reload(root);
}
}
String[] data
是该节点下的所有文件/目录。 Boolean[] isDirectory
是每个节点是否都是目录。就像我说的,node
是选定的节点。