JTree实现文件管理器的bug,请高手帮助
程序代码:
运行了之后,只能显示默认目录下的文件夹,子文件夹无法实现折叠和展开,也就是说事件TreeExpansionEvent事件无法触发[code=Java][package cn.buaa; import javax.swing.*; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import java.awt.*; import public class DemoWindow extends JFrame implements TreeExpansionListener { //显示目录的树状视图 JTree tree =null; //树状视图的模型类 DefaultTreeModel dtm=null; //构造函数 public DemoWindow(){ super(); //设置默认的查看目录 File f=new File("G:"); //建立树状视图的根节点 DefaultMutableTreeNode top = new DefaultMutableTreeNode(f.getPath()); //设置树状视图的初始状态到树状视图模型类 getRoot(top,f); //建立树状视图模型类 dtm=new DefaultTreeModel(top); dtm.setAsksAllowsChildren(true); //建立树状视图 tree =new JTree(dtm); //建立树状视图的滚动条 int v= ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; JScrollPane jsp = new JScrollPane(tree,v,h); //添加树状视图 add(jsp,BorderLayout.CENTER); //添加事件监听器 tree.addTreeExpansionListener(this); } //该函数设置树状视图的初始状态到树状视图模型类 public void getRoot(DefaultMutableTreeNode superDmtn,File f){ //遍历所有下级文件 File files[]=f.listFiles(); for(int i=0;i<files.length;i++){ //建立树状视图的子节点,名称为文件名 DefaultMutableTreeNode dmtn =new DefaultMutableTreeNode(files[i]); //如果是目录,则对应的子节点允许存在子节点,显示加好标记 if(files[i].isDirectory()) dmtn.setAllowsChildren(true); else dmtn.setAllowsChildren(false); superDmtn.add(dmtn); } } //相应展开树状视图 public void treeExpanded(TreeExpansionEvent event) { //得到展开的子节点 DefaultMutableTreeNode node = (DefaultMutableTreeNode)(event.getPath()).getLastPathComponent(); //判断是否已有子节点,如果没有,遍历文件信息将其添加到当前子节点下,生成下机子节点 if(node.getChildCount()==0){ //备份当前节点 DefaultMutableTreeNode originalNode=node; //得到当前子节点名,即对应文件的名称 String fileName =node.toString(); //通过倒序上移节点,获取节点对应文件的完整路径 while(node.getParent()!=null){ node=(DefaultMutableTreeNode)node.getParent(); fileName=node.toString()+"\\"+fileName; } //继续处理当前子节点 if(originalNode !=null){ //生成当前对应文件的类变量 File f=new File(fileName); //如果是目录,继续处理 if(f.isDirectory()){ File files[]=f.listFiles(); //如果目录不为空,则循环遍历每个下级文件 if(files!=null) for(int i=0;i<files.length;i++){ DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(files[i].getName()); if(files[i].isDirectory()) dmtn.setAllowsChildren(true); else dmtn.setAllowsChildren(false); dtm.insertNodeInto(dmtn, originalNode,originalNode.getChildCount()); } dtm.reload(); } } } } //相应收缩树状视图 public void treeCollapsed(TreeExpansionEvent event) { DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(event.getPath().getLastPathComponent()); for(int i=0;i<dmtn.getChildCount();i++) dmtn.remove(i); dtm.reload(); } public static void main(String[] args){ DemoWindow frame =new DemoWindow(); frame.setSize(600,500); frame.setLocation(200,200); frame.setVisible(true); } }