问题描述
我想达到的目的很简单两个list最初list1中c盘下是文件夹list2是c盘下文件接下来只要实现点击list1中任意文件夹list1变化为任意文件夹中的文件夹list2变化为任意文件夹中的文件这种点击可以一直下去只要list1中有文件夹publicNewJFrame(){initComponents();aaa();}privatevoidinitComponents(){}//这里是对于list1list2得设定privatevoidaaa(){//显示文件与文件夹Filef=newFile("c://");Filefile;String[]m_dir=f.list();for(inti=0;i<m_dir.length;i++){file=newFile("c://"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//list1是c盘下文件夹}else{list2.add(m_dir[i]);////list2是c盘下文件}}}privatevoidlist1MouseClicked(java.awt.event.MouseEventevt){//这是双击事件Filefile;if(evt.getClickCount()==2){//双击System.out.println(list1.getSelectedItem());Filefile1=newFile(list1.getSelectedItem());//找到file1System.out.println("n="+file1.getParent());//if(file1.getParent().isEmpty()){//如果file1得父目录为空则Filefile2=newFile("c://"+list1.getSelectedItem());//file2的路径是c://所点击文件名System.out.println(file2);list1.removeAll();//清空list1以便出现子目录文件夹list2.removeAll();//晴空list2以便出现子目录文件String[]m_dir=file2.list();//所有子目录下文件文件夹for(inti=0;i<m_dir.length;i++){file=newFile(file2.toString()+"//"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//文件夹添加到list1System.out.println(m_dir[i]);}else{list2.add(m_dir[i]);//文件添加到list2}}}else{//父目录不是空Filefile2=newFile(file1.getParent()+list1.getSelectedItem());//file2是父目录/所点击文件夹System.out.println(file2.getPath());list1.removeAll();//清空list1以便出现子目录文件夹list2.removeAll();//清空list2以便出现子目录文件String[]m_dir=file1.list();//以下同上for(inti=0;i<m_dir.length;i++){file=newFile(file2.toString()+"//"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);System.out.println(m_dir[i]);}else{list2.add(m_dir[i]);}}}}}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newNewJFrame().setVisible(true);}});}privatejava.awt.Listlist1;privatejava.awt.Listlist2;}
解决方案
解决方案二:
哦我忘记说错在哪了高手应该以下就看出来了就是在检查父目录是否为空好像不起作用System.out.println这样的语句只是我自己检查用与程序达到效果无关
解决方案三:
错误不少,大体看了一下,发现三处1.不是//而应该是\(C:\2.没有初始化LIST3.没有把LIST加到画面上
解决方案四:
最关键的,事件应该这么写:list1.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvente){list1MouseClicked(e);}});
解决方案五:
引用2楼KingOf007的回复:
错误不少,大体看了一下,发现三处1.不是//而应该是\(C:\2.没有初始化LIST3.没有把LIST加到画面上
查错最好的办法是把异常信息贴出来
解决方案六:
最后Filefile1=newFile(list1.getSelectedItem());这个是得不到文件的,因为没有C:\在前面
解决方案七:
不懂,顶!!
解决方案八:
我得这个监听事件是gui生成器做出的画面然后双击list出现的监听事件3错误我没贴出来是自动生成的画面
解决方案九:
建议你首先编译自己的程序去除编译错误然后用debug调试,什么地方出错了,马上就知道了
解决方案十:
我有编译的出现错误提示全是英文而且只有指定某一个位子但是我却不知道错在哪目前我想达到目的就是设置一个变量却不知道怎么下手
解决方案十一:
把报错贴上来看看虽然是英文的但是看多了也会明白的!在不行还可以百度啊
解决方案十二:
顶
解决方案十三:
顶
解决方案十四:
过路的,帮你顶一下
解决方案十五:
谢谢帮顶我在百度中看到有建议用递归可以用在这里吗
解决方案:
引用14楼dasa5678的回复:
谢谢帮顶我在百度中看到有建议用递归可以用在这里吗
可以,但是这里没有必要。因为你这里的代码是完全的事件驱动。你的代码,我没有做更改,我用注释指出了一些问题。希望你仔细思考。importjava.awt.List;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.io.File;importjavax.swing.JFrame;importjavax.swing.JScrollPane;importjavax.swing.JSplitPane;publicclassNewJFrameextendsJFrame{/***这两个东西一定要通过new关键字初始化出来,不然会抛出java.lang.NullPointerException*/privateListlist1=newList();privateListlist2=newList();publicNewJFrame(){initComponents();aaa();setSize(600,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}privatevoidinitComponents(){JSplitPanesplitPane=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,newJScrollPane(list1),newJScrollPane(list2));list1.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvente){list1MouseClicked(e);}});getContentPane().add(splitPane);}//这里是对于list1list2得设定/***盘符的方向不对,不是"//",而是"\"*/privatevoidaaa(){//显示文件与文件夹Filef=newFile("c:\");Filefile;String[]m_dir=f.list();System.out.println(m_dir);for(inti=0;i<m_dir.length;i++){file=newFile("c:\"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//list1是c盘下文件夹}else{list2.add(m_dir[i]);////list2是c盘下文件}}}privatevoidlist1MouseClicked(MouseEventevt){//这是双击事件Filefile;if(evt.getClickCount()==2){//双击System.out.println(list1.getSelectedItem());Filefile1=newFile(list1.getSelectedItem());//找到file1System.out.println("n="+file1.getParent());///***你为何要去判断父目录呢?你看一下,父目录为空或不为空,你的操作有何区别?**且路径拼的不对。file的name只是文件名称。**你应该使用全路径,才能得到正确的文件对象这是逻辑上的问题**例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个**weblogic文件夹,全路径应该是c:beaweblogic。可是你这里却成了c:weblogic。**这显然不对。运行时候抛出的空指针异常就是因为没有取到正确的路径,而读出的内容为空String[]m_dir=**file2.list();就是这句,得到null对象,你后面却直接加以使用。**若你想得到正确的,我建议你保存一份文件列表,来存储所有要显示的file对象。**刷新界面的时候根据这个列表添加要显示的内容,文件名称等。*/if(file1.getParent()==null||file1.getParent().isEmpty()){//如果file1得父目录为空则Filefile2=newFile("c:\"+list1.getSelectedItem());//file2的路径是c://所点击文件名System.out.println(file2);list1.removeAll();//清空list1以便出现子目录文件夹list2.removeAll();//晴空list2以便出现子目录文件String[]m_dir=file2.list();//所有子目录下文件文件夹for(inti=0;i<m_dir.length;i++){file=newFile(file2.toString()+"\"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//文件夹添加到list1System.out.println(m_dir[i]);}else{list2.add(m_dir[i]);//文件添加到list2}}}else{//父目录不是空Filefile2=newFile(file1.getParent()+list1.getSelectedItem());//file2是父目录/所点击文件夹System.out.println(file2.getPath());list1.removeAll();//清空list1以便出现子目录文件夹list2.removeAll();//清空list2以便出现子目录文件String[]m_dir=file1.list();//以下同上for(inti=0;i<m_dir.length;i++){file=newFile(file2.toString()+"\"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);System.out.println(m_dir[i]);}else{list2.add(m_dir[i]);}}}}}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newNewJFrame().setVisible(true);}});}}
解决方案:
谢谢你的指正例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个**weblogic文件夹,全路径应该是c:beaweblogic。可是你这里却成了c:weblogic。目前我也发现存在这个问题就是不知道应该如何解决你说做一个储存列表就是解决办法吧这个解决列表需要什么方法呢谢谢
解决方案:
importjava.awt.List;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.io.File;importjava.util.ArrayList;importjavax.swing.JFrame;importjavax.swing.JScrollPane;importjavax.swing.JSplitPane;publicclassNewJFrameextendsJFrame{/***这两个东西一定要通过new关键字初始化出来,不然会抛出java.lang.NullPointerException*/privateListlist1=newList();privateListlist2=newList();/**这里用来存储你的list1中的所有信息,你需要的都可以来这里面找*/privatejava.util.List<File>currentParentList=newArrayList<File>();publicNewJFrame(){initComponents();aaa();setSize(600,480);setDefaultCloseOperation(EXIT_ON_CLOSE);}privatevoidinitComponents(){JSplitPanesplitPane=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,newJScrollPane(list1),newJScrollPane(list2));list1.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvente){list1MouseClicked(e);}});getContentPane().add(splitPane);}//这里是对于list1list2得设定/***盘符的方向不对,不是"//",而是"\"*/privatevoidaaa(){//显示文件与文件夹Filef=newFile("c:\");/**注意,file的list方法在这里并不合适。如果你只需要文件名的话,可以用,**但如果想得到更多信息**建议使用listFiles,返回下层的所有子目录和子文件*/refresh(f);}/***注意以下这个方法。由于所做的事情逻辑相同,我进行了一次抽取。封装成了一个单独的函数**两处调用。请注意整理一下自己的逻辑。**唉,看了你三个帖子了,第四个你是不是要问怎么返回上一级了呢……**顺便说了吧。选中的file找到后直接refresh(file.getParent());***/privatevoidrefresh(Filef){if(f==null||!f.exists()){return;}File[]files=f.listFiles();for(inti=0;i<files.length;i++){Filefile=files[i];if(file.isHidden()){//隐藏文件或文件夹过滤掉。你可以自己选择,增加或者减少显示的范围continue;}if(file.isDirectory()){currentParentList.add(file);list1.add(file.getName());}else{list2.add(file.getName());}}}privatevoidlist1MouseClicked(MouseEventevt){//这是双击事件if(evt.getClickCount()==2){//双击//此处得到双击的行号intindex=list1.getSelectedIndex();//进行有效性验证:双击无效行号,不玩了if(index<0||index>=currentParentList.size()){return;}Filef=currentParentList.get(index);currentParentList.clear();list1.removeAll();list2.removeAll();refresh(f);}}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){newNewJFrame().setVisible(true);}});}}
唉……要考虑:你要展示什么数据?从那里读取这些数据?读取的和要显示的中间存在一定差异,如何整合?整合的时候一定会需要缓存一些信息,这些信息缓存在哪里?mail给你的demo你收到了吗
解决方案:
谢谢你给的信息会好好整理思路的你写的这些有好多我都陌生没见过这个是我自己的我改的但还没到达效果好像还得做数组基础差好多东西都蒙在会社学习和两个专业同事一起研修速度赶不上别人他们都做好几年了没活干才研修和他们比有点手忙脚乱的publicclassNewJFrameextendsjavax.swing.JFrame{Fileroot=newFile("c:\");/**CreatesnewformNewJFrame*/publicNewJFrame()throwsException{initComponents();aaa();/*showAllFiles(root);*/}@SuppressWarnings("unchecked")//<editor-folddefaultstate="collapsed"desc="GeneratedCode">privatevoidinitComponents(){list1=newjava.awt.List();list2=newjava.awt.List();list3=newjava.awt.List();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);setTitle("AAAA");。。。。太长这省了pack();}//</editor-fold>privatevoidlist1MouseClicked(java.awt.event.MouseEventevt){Filefile;if(evt.getClickCount()==2){//双击System.out.println(list1.getSelectedItem());Filefile1=newFile("c:\"+list1.getSelectedItem());//找到fileString[]str=newString[10];//在这做出设定就是要取得c和list1.getSelectedItem()之间的路径这样就可以循环了str[0]=list1.getSelectedItem();Filefile2=newFile("c:\"+str[0]+"\"+list1.getSelectedItem());list1.removeAll();//清空list1以便出现子目录文件夹list2.removeAll();//晴空list2以便出现子目录文件String[]m_dir=file1.list();//所有子目录下文件文件夹for(inti=0;i<m_dir.length;i++){file=newFile(file1.toString()+"\"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//文件夹添加到list1System.out.println(m_dir[i]);}else{list2.add(m_dir[i]);//文件添加到list2}}}}privatevoidaaa(){//显示文件与文件夹Filef=newFile("c:\");Filefile;String[]m_dir=f.list();for(inti=0;i<m_dir.length;i++){file=newFile("c:\"+m_dir[i]);if(file.isDirectory()){list1.add(m_dir[i]);//list1是c盘下文件夹}else{list2.add(m_dir[i]);////list2是c盘下文件}}}privatevoidshowAllFiles(Filedir)throwsException{File[]fs=dir.listFiles();for(inti=0;i<fs.length;i++){System.out.println(fs[i].getAbsolutePath());list3.add(fs[i].getAbsolutePath());if(fs[i].isDirectory()){try{showAllFiles(fs[i]);}catch(Exceptione){}}}}publicstaticvoidmain(Stringargs[]){java.awt.EventQueue.invokeLater(newRunnable(){publicvoidrun(){try{newNewJFrame().setVisible(true);}catch(Exceptionex){}}});}//Variablesdeclaration-donotmodifyprivatejava.awt.Listlist1;privatejava.awt.Listlist2;privatejava.awt.Listlist3;//Endofvariablesdeclaration}
解决方案:
String[]str=newString[10];//在这做出设定就是要取得c和list1.getSelectedItem()之间的路径这样就可以循环了str[0]=list1.getSelectedItem();Filefile2=newFile("c:\"+str[0]+"\"+list1.getSelectedItem());
还是逻辑问题。我举个例子:当前左边是c:。假如你双击得到了两个文件夹A和B然后呢,你的str[0]内容就是“c:”然后你newFile("c:\"+str[0]+"\"+list1.getSelectedItem());
你看看你得到的路径是什么?c:c:\c:这可不是一个合法的路径……按照你的思路来走,你一定要把完整的路径正确保存才行。仅仅玩文件名是不够的。且会很复杂。
解决方案:
恩是的我以为那里的毛病在于路径问题所以我就想把路径给他摆正确了例如c:/a/b/c/d/e路径是这样第一次取c:/a第二次就是c:/ba没有了但是a可以从上一次记忆中得到吧反正就是错误中得到嘿嘿别的不会呀就逮住一个错误就解决我会好好研究的这个明天中午前得完成呵呵
解决方案:
研究过你的写得了太佩服了这是几年的成果呀
解决方案:
呵呵,那只是二十分钟随意写的。其实,里面还有一些问题的,只是我没有去深究罢了。比如,有的人机器上装载有虚拟光驱,可是事实上这个目录不存在的,一定要加以检查。不然很有可能出现意想不到的问题。你一定要学会debug跟踪代码。身边的同同事有时候连续跟踪几千行代码来寻找一个错误也是常有的事情。你还年轻,虽然从一个角度上来说,你所会的不多,但是你的可塑空前却也是非常大的。若你能挺住,一定会有一个飞跃……当然,不知道你需要花多少钱买化妆品弥补了……
解决方案:
其实刚开始的时候我什么都不会。不过,呵呵,我不怕丢人。那时候,公司有一个大技术顾问,我为了学习中的一个小问题,我记得很清楚,强制转化。身边没有搞java的,我就用msn把那家伙喊了过来,呵呵,他目瞪口呆地看着我。据说我还是第一个以实习生的身份惊动了技术顾问的人……虽然当年混得不怎么好,今天也只是更换了环境重新起步。可是,回想起来,当年的人和事请,似乎少了谁,少了什么都无关紧要,可是,却又似乎,无论少了什么,我都不会是今天的我。
解决方案:
恩是啊就是得挺住学习我身边的人都是日本人沟通起来有点费劲也不知道他们什么心理就是有种说不出来的感觉你的这段代码对我来说都完美去了呵呵privatejava.util.List<File>currentParentList=newArrayList<File>();为什么偏偏这么写一般不都这么些我这么写了以后出现错位这个就是一个虚拟的表格装list1的?他依靠着refresh(f)更新是吗?privateList<File>currentParentList=newArrayList<File>();