我想达到的目的很简单 两个list 最初list1中c盘下是文件夹 list2是c盘下文件  接下来只要实现点击list1中任意文件夹 list1变化为任意文件夹中的文件夹 list2变化为任意文件夹中的文件  这种点击可以一直下去只要list1中有文件夹public NewJFrame() {
        initComponents();
        aaa();
    }        private void initComponents() {
    }// 这里是对于list1 list2得设定
    private void aaa() {//显示文件与文件夹
        File f = new File("c://");
        File file;
        String[] m_dir = f.list();
        for (int i = 0; i < m_dir.length; i++) {
            file = new File("c://" + m_dir[i]);
            if (file.isDirectory()) {
                list1.add(m_dir[i]);//list1是c盘下文件夹
            } else {
                list2.add(m_dir[i]);////list2是c盘下文件
            }
        }
    }
    private void list1MouseClicked(java.awt.event.MouseEvent evt) {        //这是双击事件                           
        File file;
        if (evt.getClickCount() == 2) {     //双击
            System.out.println(list1.getSelectedItem());
            File file1 = new File(list1.getSelectedItem());//找到file1
            System.out.println("n=" + file1.getParent());//
            if (file1.getParent().isEmpty()) {  //如果file1得父目录为空则
                File file2 = new File("c://" + list1.getSelectedItem());//file2的路径是c://所点击文件名
                System.out.println(file2);
                list1.removeAll();//清空list1 以便出现子目录文件夹
                list2.removeAll();//晴空list2 以便出现子目录文件
                String[] m_dir = file2.list();//所有子目录下文件文件夹
                for (int i = 0; i < m_dir.length; i++) {
                    file = new File(file2.toString() + "//" + m_dir[i]);
                    if (file.isDirectory()) {
                        list1.add(m_dir[i]);//文件夹添加到list1
                        System.out.println(m_dir[i]);
                    } else {
                        list2.add(m_dir[i]);//文件添加到list2
                    }                }
            } else {//父目录不是空
                File file2 = new File(file1.getParent() + list1.getSelectedItem());//file2是父目录/所点击文件夹
                System.out.println(file2.getPath());
                list1.removeAll();//清空list1 以便出现子目录文件夹
                list2.removeAll();//清空list2 以便出现子目录文件
                String[] m_dir = file1.list();//以下同上
                for (int i = 0; i < m_dir.length; i++) {
                    file = new File(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]);
                    }                }
            }
        }
    }                                  
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }    private java.awt.List list1;
    private java.awt.List list2;}

解决方案 »

  1.   

    哦 我忘记说错在哪了 高手应该以下就看出来了
    就是在检查父目录是否为空 好像不起作用
    System.out.println这样的语句只是我自己检查用 
    与程序达到效果无关  
      

  2.   

    错误不少,大体看了一下,发现三处
    1.不是// 而应该是\\ (C:\\
    2.没有初始化LIST
    3.没有把LIST加到画面上
      

  3.   

    最关键的,事件应该这么写:
            list1.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    list1MouseClicked(e);
                }
            });
      

  4.   

    最后 File file1 = new File(list1.getSelectedItem());
    这个是得不到文件的,因为没有C:\\在前面
      

  5.   

    我得这个监听事件是gui生成器做出的画面 然后双击list出现的监听事件
    3错误 我没贴出来 是自动生成的画面
      

  6.   

    建议你首先编译自己的程序
    去除编译错误
    然后用debug调试,什么地方出错了,马上就知道了
      

  7.   

    可以,但是这里没有必要。因为你这里的代码是完全的事件驱动。
    你的代码,我没有做更改,我用注释指出了一些问题。希望你仔细思考。
    import java.awt.List;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.File;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;public class NewJFrame extends JFrame { /**
     * 这两个东西一定要通过new关键字初始化出来, 不然会抛出java.lang.NullPointerException
     */
    private List list1 = new List();
    private List list2 = new List();

    public NewJFrame() {
    initComponents();
    aaa(); setSize(600, 480);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    } private void initComponents() {
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
    new JScrollPane(list1), new JScrollPane(list2)); list1.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
    list1MouseClicked(e);
    }
    });
    getContentPane().add(splitPane);
    }// 这里是对于list1 list2得设定 /**
     * 盘符的方向不对,不是"//",而是"\\"
     */
    private void aaa() {// 显示文件与文件夹
    File f = new File("c:\\");
    File file;
    String[] m_dir = f.list();
    System.out.println(m_dir);
    for (int i = 0; i < m_dir.length; i++) {
    file = new File("c:\\" + m_dir[i]);
    if (file.isDirectory()) {
    list1.add(m_dir[i]);// list1是c盘下文件夹
    } else {
    list2.add(m_dir[i]);// //list2是c盘下文件
    }
    }
    } private void list1MouseClicked(MouseEvent evt) { // 这是双击事件
    File file; if (evt.getClickCount() == 2) { // 双击
    System.out.println(list1.getSelectedItem());
    File file1 = new File(list1.getSelectedItem());// 找到file1
    System.out.println("n=" + file1.getParent());//
    /**
     * 你为何要去判断父目录呢?你看一下,父目录为空或不为空,你的操作有何区别?
     * 
     * 且路径拼的不对。file的name只是文件名称。
     * 
     * 你应该使用全路径,才能得到正确的文件对象 这是逻辑上的问题
     * 
     * 例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个
     * 
     * weblogic文件夹,全路径应该是c:\bea\weblogic。可是你这里却成了c:\weblogic。
     * 
     * 这显然不对。运行时候抛出的空指针异常就是因为没有取到正确的路径,而读出的内容为空 String[] m_dir =
     * 
     * file2.list();就是这句,得到null对象,你后面却直接加以使用。
     * 
     * 若你想得到正确的,我建议你保存一份文件列表,来存储所有要显示的file对象。
     * 
     * 刷新界面的时候根据这个列表添加要显示的内容,文件名称等。
     */ if (file1.getParent() == null || file1.getParent().isEmpty()) { // 如果file1得父目录为空则
    File file2 = new File("c:\\" + list1.getSelectedItem());// file2的路径是c://所点击文件名
    System.out.println(file2);
    list1.removeAll();// 清空list1 以便出现子目录文件夹
    list2.removeAll();// 晴空list2 以便出现子目录文件
    String[] m_dir = file2.list();// 所有子目录下文件文件夹
    for (int i = 0; i < m_dir.length; i++) {
    file = new File(file2.toString() + "\\" + m_dir[i]);
    if (file.isDirectory()) {
    list1.add(m_dir[i]);// 文件夹添加到list1
    System.out.println(m_dir[i]);
    } else {
    list2.add(m_dir[i]);// 文件添加到list2
    } }
    } else {// 父目录不是空
    File file2 = new File(file1.getParent()
    + list1.getSelectedItem());// file2是父目录/所点击文件夹
    System.out.println(file2.getPath());
    list1.removeAll();// 清空list1 以便出现子目录文件夹
    list2.removeAll();// 清空list2 以便出现子目录文件
    String[] m_dir = file1.list();// 以下同上
    for (int i = 0; i < m_dir.length; i++) {
    file = new File(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]);
    } }
    }
    }
    } public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
    new NewJFrame().setVisible(true);
    }
    });
    }}
      

  8.   

    谢谢 你的指正
    例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个
                 * 
                 * weblogic文件夹,全路径应该是c:\bea\weblogic。可是你这里却成了c:\weblogic。
    目前我也发现存在这个问题 就是不知道应该如何解决 你说做一个储存列表就是解决办法吧
    这个解决列表需要什么方法呢
    谢谢
      

  9.   

    import java.awt.List;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.File;
    import java.util.ArrayList;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;public class NewJFrame extends JFrame { /**
     * 这两个东西一定要通过new关键字初始化出来, 不然会抛出java.lang.NullPointerException
     */
    private List list1 = new List();
    private List list2 = new List(); /*
     * 这里用来存储你的list1中的所有信息,你需要的都可以来这里面找
     */
    private java.util.List<File> currentParentList = new ArrayList<File>(); public NewJFrame() {
    initComponents();
    aaa(); setSize(600, 480);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    } private void initComponents() {
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
    new JScrollPane(list1), new JScrollPane(list2)); list1.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
    list1MouseClicked(e);
    }
    });
    getContentPane().add(splitPane);
    }// 这里是对于list1 list2得设定 /**
     * 盘符的方向不对,不是"//",而是"\\"
     */
    private void aaa() {// 显示文件与文件夹
    File f = new File("c:\\"); /*
     * 注意,file的list方法在这里并不合适。如果你只需要文件名的话,可以用,
     * 
     * 但如果想得到更多信息
     * 
     * 建议使用listFiles,返回下层的所有子目录和子文件
     */ refresh(f);
    } /**
     * 注意以下这个方法。由于所做的事情逻辑相同,我进行了一次抽取。封装成了一个单独的函数
     * 
     * 两处调用。请注意整理一下自己的逻辑。
     * 
     * 唉,看了你三个帖子了,第四个你是不是要问怎么返回上一级了呢……
     * 
     * 顺便说了吧。选中的file找到后直接refresh(file.getParent());
     * **/ private void refresh(File f) {
    if (f == null || !f.exists()) {
    return;
    }
    File[] files = f.listFiles();
    for (int i = 0; i < files.length; i++) {
    File file = files[i];
    if (file.isHidden()) {
    // 隐藏文件或文件夹过滤掉。你可以自己选择,增加或者减少显示的范围
    continue;
    } if (file.isDirectory()) {
    currentParentList.add(file);
    list1.add(file.getName());
    } else {
    list2.add(file.getName());
    }
    }
    } private void list1MouseClicked(MouseEvent evt) { // 这是双击事件 if (evt.getClickCount() == 2) { // 双击
    // 此处得到双击的行号
    int index = list1.getSelectedIndex();
    // 进行有效性验证 : 双击无效行号,不玩了
    if (index < 0 || index >= currentParentList.size()) {
    return;
    } File f = currentParentList.get(index); currentParentList.clear();
    list1.removeAll();
    list2.removeAll();
    refresh(f); }
    } public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
    new NewJFrame().setVisible(true);
    }
    });
    }}唉……要考虑:
    你要展示什么数据?
    从那里读取这些数据?
    读取的和要显示的中间存在一定差异,如何整合?
    整合的时候一定会需要缓存一些信息,这些信息缓存在哪里?mail给你的demo你收到了吗
      

  10.   

    谢谢你给的信息 会好好整理思路的 你写的这些有好多我都陌生 没见过 
    这个是我自己的 我改的 但还没到达效果 好像还得做数组
    基础差 好多东西都蒙 在会社学习 和两个专业同事一起研修 速度赶不上别人 他们都做好几年了 没活干才研修 和他们比 有点手忙脚乱的 public class NewJFrame extends javax.swing.JFrame {    File root = new File("c:\\");    /** Creates new form NewJFrame */
        public NewJFrame() throws Exception {
            initComponents();
            aaa();
            /*showAllFiles(root);*/
        }    @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {        list1 = new java.awt.List();
            list2 = new java.awt.List();
            list3 = new java.awt.List();        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("AAAA");       。太长 这省了        pack();
        }// </editor-fold>                            private void list1MouseClicked(java.awt.event.MouseEvent evt) {                                   
            File file;
            if (evt.getClickCount() == 2) {     //双击
                System.out.println(list1.getSelectedItem());
                File file1 = new File("c:\\" + list1.getSelectedItem());//找到file
                String[] str = new String[10];//在这做出设定 就是要取得 c和list1.getSelectedItem()之间的路径这样就可以循环了
                str[0] = list1.getSelectedItem();
                File file2 = new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());
                    list1.removeAll();//清空list1 以便出现子目录文件夹
                    list2.removeAll();//晴空list2 以便出现子目录文件
                    String[] m_dir = file1.list();//所有子目录下文件文件夹
                    for (int i = 0; i < m_dir.length; i++) {
                        file = new File(file1.toString() + "\\" + m_dir[i]);
                        if (file.isDirectory()) {
                            list1.add(m_dir[i]);//文件夹添加到list1
                            System.out.println(m_dir[i]);
                        } else {
                            list2.add(m_dir[i]);//文件添加到list2
                        }                }
            }
        }                                      private void aaa() {//显示文件与文件夹
            File f = new File("c:\\");
            File file;
            String[] m_dir = f.list();
            for (int i = 0; i < m_dir.length; i++) {
                file = new File("c:\\" + m_dir[i]);
                if (file.isDirectory()) {
                    list1.add(m_dir[i]);//list1是c盘下文件夹            } else {
                    list2.add(m_dir[i]);////list2是c盘下文件
                }
            }
        }    private void showAllFiles(File dir) throws Exception {
            File[] fs = dir.listFiles();
            for (int i = 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 (Exception e) {
                    }
                }
            }
        }
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {            public void run() {
                    try {
                        new NewJFrame().setVisible(true);
                    } catch (Exception ex) {
                       
                    }
                }
            });
        }    // Variables declaration - do not modify                     
        private java.awt.List list1;
        private java.awt.List list2;
        private java.awt.List list3;
        // End of variables declaration                   
    }
      

  11.   


      String[] str = new String[10];//在这做出设定 就是要取得 c和list1.getSelectedItem()之间的路径这样就可以循环了
                str[0] = list1.getSelectedItem();
                File file2 = new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());
    还是逻辑问题。我举个例子:
    当前左边是
    c:\。 假如 你双击得到了两个文件夹 A 和 B
    然后呢,你的str[0] 内容就是 “c:\”然后你 new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());你看看你得到的路径是什么?
    c:\c:\\c:\
    这可不是一个合法的路径……按照你的思路来走,你一定要把完整的路径正确保存才行。仅仅玩文件名是不够的。且会很复杂。
      

  12.   

    恩 是的 我以为那里的毛病在于路径问题
    所以我就想把路径给他摆正确了
    例如c:/a/b/c/d/e路径是这样第一次取c:/a 第二次就是c:/b a没有了 但是a可以从上一次记忆中得到吧 反正就是错误中得到 嘿嘿 别的不会呀 就逮住一个错误就解决
    我会好好研究的
    这个明天中午前得完成 呵呵
      

  13.   

    呵呵,那只是二十分钟随意写的。其实,里面还有一些问题的,只是我没有去深究罢了。比如,有的人机器上装载有虚拟光驱,可是事实上这个目录不存在的,一定要加以检查。不然很有可能出现意想不到的问题。你一定要学会debug跟踪代码。身边的同同事有时候连续跟踪几千行代码来寻找一个错误也是常有的事情。你还年轻,虽然从一个角度上来说,你所会的不多,但是你的可塑空前却也是非常大的。若你能挺住,一定会有一个飞跃……当然,不知道你需要花多少钱买化妆品弥补了……
      

  14.   

    其实刚开始的时候我什么都不会。不过,呵呵,我不怕丢人。那时候,公司有一个大技术顾问,我为了学习中的一个小问题,我记得很清楚,强制转化。身边没有搞java的,我就用msn把那家伙喊了过来,呵呵,他目瞪口呆地看着我。据说我还是第一个以实习生的身份惊动了技术顾问的人……虽然当年混得不怎么好,今天也只是更换了环境重新起步。可是,回想起来,当年的人和事请,似乎少了谁,少了什么都无关紧要,可是,却又似乎,无论少了什么,我都不会是今天的我。
      

  15.   

    恩 是啊 
    就是得挺住学习
    我身边的人都是日本人 沟通起来有点费劲
    也不知道他们什么心理 就是有种说不出来的感觉 你的这段代码对我来说都完美去了
    呵呵private java.util.List<File> currentParentList = new ArrayList<File>();
    为什么偏偏这么写 一般不都这么些 我这么写了以后出现错位
    这个就是一个虚拟的表格 装list1的?他依靠着refresh(f)更新 是吗?
    private List<File> currentParentList = new ArrayList<File>();