Java JTree:为什么我的目录不';不象目录吗?
在探索JTree组件时,我编写了一个小类,它将列出我硬盘上的目录和文件。为了避免“完整扫描”耗时数分钟,浪费时间和资源,我决定只探索“活动节点”的1个子级别。所谓“活动节点”,我指的是目录被点击或节点被展开 对于单击的目录,它工作得非常完美:我可以浏览我的目录和子目录,代码“逐级”工作,单击的目录看起来像目录 但是如果我扩展一个节点,它就会失败!探索此节点的子节点运行的方法;它可以找到所有的子目录并通过“System.out.println(…)”列出它们,但是我的目录仍然像文件一样显示,即使它们有子目录。要使目录看起来像目录,我必须单击它(=使用“第一种方法”) 这是我的密码。有人能解释我失败的原因吗Java JTree:为什么我的目录不';不象目录吗?,java,nodes,jtree,expand,Java,Nodes,Jtree,Expand,在探索JTree组件时,我编写了一个小类,它将列出我硬盘上的目录和文件。为了避免“完整扫描”耗时数分钟,浪费时间和资源,我决定只探索“活动节点”的1个子级别。所谓“活动节点”,我指的是目录被点击或节点被展开 对于单击的目录,它工作得非常完美:我可以浏览我的目录和子目录,代码“逐级”工作,单击的目录看起来像目录 但是如果我扩展一个节点,它就会失败!探索此节点的子节点运行的方法;它可以找到所有的子目录并通过“System.out.println(…)”列出它们,但是我的目录仍然像文件一样显示,即使它
import java.awt.BorderLayout;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
public class Explorer2 extends JPanel {
private JTree tree;
private DefaultMutableTreeNode root= new DefaultMutableTreeNode();
int countSubLevel=0;
int limit=1;
Explorer2() {
DefaultMutableTreeNode driveNode=null;
for (File file:File.listRoots()) {
driveNode = new DefaultMutableTreeNode(file.getAbsolutePath());
//testLeaf(driveNode);
exploreDirectory(file, driveNode);
root.add(driveNode);
}
displayTree();
}
Explorer2(String rootDirectory) {
File file = new File(rootDirectory);
DefaultMutableTreeNode directoryNode = new DefaultMutableTreeNode(file.getAbsolutePath());
exploreDirectory(file, directoryNode);
root.add(directoryNode);
displayTree();
}
public void exploreDirectory (File dir, DefaultMutableTreeNode dirNode) {
if (dir.isDirectory()) {
//System.out.println(dir+" (parent) is a directory. Its level is : "+dirNode.getLevel());
try {
for (File file:dir.listFiles()) {
DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(file.getAbsolutePath());
dirNode.add(fileNode);
//System.out.println(dirNode+" - "+file+" - Level = "+fileNode.getLevel());
/*
if (fileNode.getLevel()<limit) {
System.out.println(file+" (child) have a level : "+fileNode.getLevel());
exploreDirectory(file, fileNode);
} else {
//System.out.println("Not in the loop : "+fileNode.getLevel());
}
*/
}
} catch (NullPointerException e) {
System.err.println(dir+" generates a NullPointerException");
}
} else {
System.out.println(dir+" is a file. Its level is : "+dirNode.getLevel());
}
countSubLevel+=1;
}
public void displayTree () {
DefaultTreeModel treeModel = new DefaultTreeModel(root);
tree = new JTree(treeModel);
//tree = new JTree(root);
tree.setRootVisible(true);
tree.addTreeSelectionListener(new MyTreeSelectionListener());
tree.addTreeExpansionListener(new MyTreeExpansionListener());
this.setLayout(new BorderLayout());
this.add(new JScrollPane(tree), BorderLayout.CENTER);
}
public void testLeaf(DefaultMutableTreeNode dir) {
if (dir.isLeaf()) {
System.out.println("Rien en dessous de "+dir);
} else {
System.out.println("Creuse !");
}
}
class MyTreeSelectionListener implements TreeSelectionListener {
@Override
public void valueChanged(TreeSelectionEvent arg0) {
if (tree.getLastSelectedPathComponent() != null) {
File dir = new File(tree.getLastSelectedPathComponent().toString());
DefaultMutableTreeNode dirNode = (DefaultMutableTreeNode) arg0.getPath().getLastPathComponent();
DefaultMutableTreeNode fileNode=null;
//System.out.println(dirNode.getChildCount());
if (dirNode.getChildCount()==0) {
System.out.println("The directory is : "+dir+" - Node : "+dirNode);
exploreDirectory(dir, dirNode);
}
}
}
}
class MyTreeExpansionListener implements TreeExpansionListener {
@Override
public void treeCollapsed(TreeExpansionEvent arg0) {
System.out.println("Collapsed : "+arg0.getPath().getLastPathComponent());
}
@Override
public void treeExpanded(TreeExpansionEvent arg0) {
DefaultMutableTreeNode dir = (DefaultMutableTreeNode) arg0.getPath().getLastPathComponent();
DefaultMutableTreeNode fileNode=null;
System.out.println("Expanded directory is : "+dir+" - Number of child : "+dir.getChildCount());
for (int i=0 ; i<dir.getChildCount() ; i++) {
File file = new File(dir.getChildAt(i).toString());
fileNode = new DefaultMutableTreeNode(file.getAbsolutePath());
exploreDirectory(file, fileNode);
System.out.println("*"+i+" - directory is : "+dir+" - Files are : "+file+" - Number of children : "+fileNode.getChildCount());
}
}
}
public static void main(String[] args) {
JFrame window = new JFrame ();
window.setSize(500, 600);
window.setTitle("Explorateur");
window.setLocationRelativeTo(null);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new BorderLayout());
String str = System.getProperty("user.home");
//Explorer2 explorer = new Explorer2(str);
Explorer2 explorer = new Explorer2();
window.getContentPane().add(explorer);
window.setVisible(true);
}
}
导入java.awt.BorderLayout;
导入java.io.File;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.event.TreeExpansionEvent;
导入javax.swing.event.TreeExpansionListener;
导入javax.swing.event.TreeSelectionEvent;
导入javax.swing.event.TreeSelectionListener;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.TreePath;
公共类探索者2扩展了JPanel{
私有JTree树;
私有DefaultMutableTreeNode根=新的DefaultMutableTreeNode();
int countSubLevel=0;
整数极限=1;
探险家2(){
DefaultMutableTreeNode驱动节点=null;
对于(文件:File.listRoots()){
driveNode=新的DefaultMutableTreeNode(file.getAbsolutePath());
//testLeaf(driveNode);
exploreDirectory(文件、驱动节点);
添加(驱动节点);
}
displayTree();
}
Explorer2(字符串根目录){
File File=新文件(根目录);
DefaultMutableTreeNode目录节点=新的DefaultMutableTreeNode(file.getAbsolutePath());
exploreDirectory(文件、目录节点);
添加(directoryNode);
displayTree();
}
public void exploreditory(文件目录,DefaultMutableTreeNode目录){
if(dir.isDirectory()){
//System.out.println(dir+“(parent)是一个目录,其级别为:“+dirNode.getLevel()”;
试一试{
对于(文件:dir.listFiles()){
DefaultMutableTreeNode fileNode=新的DefaultMutableTreeNode(file.getAbsolutePath());
添加(fileNode);
//System.out.println(dirNode+“-”+file+“-Level=“+fileNode.getLevel());
/*
if(fileNode.getLevel()您需要使用TreeModel
类,例如DefaultTreeModel
,作为树中节点的模型。它有方法让系统确定给定节点是否为叶,以及是否允许任何节点包含子节点或是否包含子节点(如您的情况)只有某些节点可以包含子节点
您的程序不使用自己的模型,因此JTree
只创建自己的模型;因为它创建的模型无法判断节点是否是叶,除非它展开,否则它不知道它是带子节点的父节点,直到它展开,侦听器向其中添加节点。您使用的是DefaultTreeModel wi对于DefaultMutableTreeNodes,他们无法知道给定节点是子树还是叶。请扩展DefaultMutableTreeNode并在eadh节点中放置对文件对象的引用,或者将文件对象放置在每个DefaultMutableTreeNode实例的setUserObject中。然后在DefaultTreeModel的扩展名中重写isLeaf,并检查文件对象t来确定它是否有子节点。Swing将调用此函数来确定如何显示该节点。