我用时没有ArrayIndexOutOfBoundsException

解决方案 »

  1.   

    我发现在删除一个目录后,再添加时在做
    DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
    后selectedNode.getChildCount()返回正确值的两倍。
    所以
    model.insertNodeInto(newNode,selectedNode,selectedNode.getChildCount());
    就错了。
    xx > xx前面就是selectedNode.getChildCount(),后面是当前model里的值。
    如果你用model.insertNodeInto(newNode,selectedNode,0);就会发现错误。我还在努力调试。但我对swing的熟悉程度估计跟你一样我也只知道这些:)。
    看看别的高手能不能帮你。
      

  2.   

    sorry,没有看仔细你的程序。
    这是个逻辑错误。
    当你删除目录后,public void valueChanged(TreeSelectionEvent event)
    将被调用。又重新装入了一边目录。所以会有两倍内容的情况。
    你应该先
    p.removeAllChildren();
    在作你的代码。
      

  3.   

    所有的code/*===============================DirBrowserTest.java=========================================*/import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    import javax.swing.JOptionPane;//------------------------------------------------------------------------------------------public class DirBrowserTest
    {
    public static void main(String[] args)
    {
    JFrame frame = new DirBrowserTestFrame();
    frame.show();
    }
    }//--------------------------------------------------------------------------------------------class DirBrowserTestFrame extends JFrame implements ActionListener,TreeSelectionListener
    {
    public DirBrowserTestFrame()
    {
    setTitle("DirBrowser");
    setSize(400,300);
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });root = new DefaultMutableTreeNode("root");
    root.setAllowsChildren(true);
    root.add(new DefaultMutableTreeNode(new File("C:\\")));
    root.add(new DefaultMutableTreeNode(new File("D:\\")));
    root.add(new DefaultMutableTreeNode(new File("E:\\")));
    root.add(new DefaultMutableTreeNode(new File("F:\\")));
    root.add(new DefaultMutableTreeNode(new File("G:\\")));model = new DefaultTreeModel(root);
    tree = new JTree(model);
    tree.putClientProperty("JTree.lineStyle" , "Angled");
            tree.setRootVisible(false);
            tree.setEditable(true);  //°ÑÊ÷ÉèΪ¿É±à¼­//setup the selection mode
    tree.addTreeSelectionListener(this);
    int mode = TreeSelectionModel.SINGLE_TREE_SELECTION;
    tree.getSelectionModel().setSelectionMode(mode);model.setAsksAllowsChildren(true);          //Ö»ÓÐÊÖ¶¯ÔÊÐíµÄ½Úµã¿ÉÒÔ±íʾΪҳ½Úµã//this text area holds the current directory
    textArea = new JTextArea();JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1,2));
    panel.add(new JScrollPane(tree));
    panel.add(new JScrollPane(textArea));AddDir = new JButton("AddDir");
    Delete = new JButton("Delete");
    AddDir.addActionListener(this);
    Delete.addActionListener(this);
    JPanel p = new JPanel();
    p.setLayout(new FlowLayout());
    p.add(AddDir);
    p.add(Delete);
    Container contentPane = getContentPane();
    contentPane.add(panel,"Center");
    contentPane.add(p,"South");
    }//--------------------------------------------------------------------------------------------public void actionPerformed(ActionEvent event)
    {
    DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
    if(selectedNode == null)return;
    // DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)selectedNode.getParent();
    Object source = event.getSource();
    if(source == AddDir)
    {
    if(!selectedNode.getAllowsChildren())return;
    NewDirInfo n = new NewDirInfo("newdir");
    if(newDialog == null)newDialog = new NewDirDialog(this);
    if(newDialog.showDialog(n))
    //String dirname = "";
    //if((dirname = JOptionPane.showInputDialog(this , "Please input the new dir name" , "Input Dialog" , JOptionPane.QUESTION_MESSAGE)) != "")
    {
    try{
            String dirname = n.dirname;      //ÓɶԻ°¿ò°ÑҪн¨µÄÎļþ¼ÐÃû×ÖÈ¡³ö
            System.out.println(dirname);    //just for debug!
            File parentDir = (File)selectedNode.getUserObject();
            File newFile = new File(parentDir + "\\" + dirname);
            if(!newFile.exists())
                {
                  newFile.mkdir();
                  textArea.setText("Maked Directory " + dirname);
                  }
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(newFile);
            newNode.setAllowsChildren(true);
            System.out.println(selectedNode.getChildCount());    //just for debug!
            model.insertNodeInto(newNode,selectedNode,selectedNode.getChildCount());
            TreeNode[] nodes = model.getPathToRoot(newNode);
            TreePath path = new TreePath(nodes);
            tree.scrollPathToVisible(path);
        }
    catch(ArrayIndexOutOfBoundsException e)
    {
    e.printStackTrace();
    }
    }
    return;
    }
    else if(source == Delete)
    {
    File targetDir = (File)selectedNode.getUserObject();
    if(JOptionPane.showConfirmDialog(this , "Are you sure to delete " + targetDir.toString() , "Delete Confirmed" , JOptionPane.YES_NO_OPTION , JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION)
    {
     targetDir.delete();
                    textArea.setText("Delete Directory " + targetDir);
                    TreeNode tn=selectedNode.getParent();
                    if(tn != null)
                    model.removeNodeFromParent(selectedNode);
                    model.nodeChanged(tn);
                    return;
    }
    }
    }//--------------------------------------------------------------------------------------------public void valueChanged(TreeSelectionEvent event)
    {
        textArea.setText("");
        TreePath path = tree.getSelectionPath();
        if(path == null) return;
        DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode)path.getLastPathComponent();
        if(selectNode.getAllowsChildren())Explorer2(selectNode);  //ÅжÏÊÇ·ñ¿ÉÒÔÓÐ×ӽڵ㣬²Åµ÷ÓÃExplorer3(),²¢ÇÒÏÔʾ¸ÃĿ¼ÏÂËùÓÐÎļþÃû
        else
        {
    File temp = (File)selectNode.getUserObject();
    textArea.setText(temp.toString());          //Ö»ÏÔʾѡÖÐÎļþµÄÎļþÃû
    }}//--------------------------------------------------------------------------------------------/*    public void Explorer(DefaultMutableTreeNode p)  //¼ì²âĿ¼µÄµÝ¹éËã·¨,Ò»´ÎÐÔÈ«²¿LoadÈ룬Òò´ËËÙ¶ÈÂý£¬¶øÇÒÎÞ·¨ÏÔʾ±ä»¯£¬²»¿ÉÈ¡
    {
    try{boolean isAllFiles = true;
    String[] list = path.list();
    for(int i = 0; i<list.length;i++)
    {
    File NotKnown = new File(path + "\\" + list[i]);
    if(NotKnown.isFile())
    {
            textArea.append(list[i] + '\n');
    p.add(new DefaultMutableTreeNode(NotKnown));
    }else if(NotKnown.isDirectory())
    {
            textArea.append(list[i] + '\n');
    isAllFiles = false;
    tempDir = new DefaultMutableTreeNode(NotKnown);
    p.add(tempDir);
    Explorer(tempDir);
    }  }
                if(isAllFiles == true)return;}
    catch(Exception e)
      {
        System.out.println("Error: " + e);
        }
    }
      */
    //------------------------------------------------------------------------------------------------------public static boolean isLeaf(File n)  //&Aring;&ETH;&para;&Iuml;&Ecirc;&Ccedil;·&ntilde;&Icirc;&ordf;&Ograve;&sup3;&frac12;&Uacute;&micro;&atilde;&pound;&not;&micro;±&Icirc;&ordf;&Icirc;&Auml;&frac14;&thorn;&para;&oslash;&sup2;&raquo;&Ecirc;&Ccedil;&Icirc;&Auml;&frac14;&thorn;&frac14;&ETH;&Ecirc;±&pound;&not;·&micro;&raquo;&Oslash;true&pound;&not;·&ntilde;&Ocirc;ò·&micro;&raquo;&Oslash;false 
    {
    return n.isFile();
    }//------------------------------------------------------------------------------------------------------public void Explorer2(DefaultMutableTreeNode p)  //&frac14;ì&sup2;&acirc;&Auml;&iquest;&Acirc;&frac14;&micro;&Auml;×&icirc;&ordm;&Atilde;·&frac12;·¨
    {
    p.removeAllChildren();
    try{
    File path = (File)p.getUserObject();
    String[] list = path.list();
    for(int i = 0; i<list.length;i++)
    {
    File NotKnown = new File(path + "\\" + list[i]);
    if(NotKnown.isFile())
    {
            textArea.append(list[i] + '\n');
    tempLeaf = new DefaultMutableTreeNode(NotKnown);
    tempLeaf.setAllowsChildren(false);
    p.add(tempLeaf);
    }else if(NotKnown.isDirectory())
    {
            textArea.append(list[i] + '\n');
        tempDir = new DefaultMutableTreeNode(NotKnown);
    tempDir.setAllowsChildren(true);
    p.add(tempDir);
    }}
        }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }
    //------------------------------------------------------------------------------------------------------
    private DefaultMutableTreeNode root;
    private DefaultMutableTreeNode tempDir;  //&Ocirc;&Yacute;&Ecirc;±&micro;&Auml;&Auml;&iquest;&Acirc;&frac14;&frac12;&Uacute;&micro;&atilde;±&auml;&Aacute;&iquest;
    private DefaultMutableTreeNode tempLeaf;  //&Ocirc;&Yacute;&Ecirc;±&micro;&Auml;&Ograve;&sup3;&frac12;&Uacute;&micro;&atilde;±&auml;&Aacute;&iquest;
    private DefaultTreeModel model;
    private JTree tree;
    private JTextArea textArea;
    private JButton AddDir;                  //&Igrave;í&frac14;&Oacute;&Auml;&iquest;&Acirc;&frac14;
    private JButton Delete;                  //&Eacute;&frac34;&sup3;&yacute;&Auml;&iquest;&Acirc;&frac14;
    private NewDirDialog newDialog;          //&para;&Ocirc;&raquo;°&iquest;ò
    }//=========================================================================================/*==================================NewDirInfo.class=====================================*/class NewDirInfo
    {
    public String dirname;
    public NewDirInfo(String d)
    {
    dirname = d;
    }
    }//=========================================================================================/*==================================NewDirDialog.class=====================================*/class NewDirDialog extends JDialog implements ActionListener
    {
    public NewDirDialog(JFrame parent)
    {
    super(parent , "Make New Directory" , true);
    Container contentPane = getContentPane();
    JPanel p1 = new JPanel();
    p1.setLayout(new GridLayout(1,2));
        p1.add(new JLabel("New Directory Name: "));
        p1.add(newdirname = new JTextField(""));
        contentPane.add("Center",p1);    JPanel p2 = new JPanel();
        okButton = addButton(p2,"ok");
        cancelButton = addButton(p2,"cancel");
        contentPane.add("South",p2);
        setSize(240,120);
    }//-----------------------------------------------------------------------------------------
    public void actionPerformed(ActionEvent evt)
    {
    Object source = evt.getSource();
    if(source == okButton)
    {
    ok = true;
    setVisible(false);
    }
    else if(source == cancelButton)
    {
    setVisible(false);
    }
    }//-----------------------------------------------------------------------------------------JButton addButton(Container c,String name)
        {
    JButton button = new JButton(name);
    button.addActionListener(this);
    c.add(button);
    return button;
    }//-----------------------------------------------------------------------------------------public boolean showDialog(NewDirInfo newdir)
    {
    newdirname.setText(newdir.dirname);    //&Eacute;è&Ouml;&Atilde;&para;&Ocirc;&raquo;°&iquest;ò&micro;&Auml;&sup3;&otilde;&Ecirc;&frac14;&Auml;&Uacute;&Egrave;&Yacute;
    ok = false;
    show();    //&Iuml;&Ocirc;&Ecirc;&frac34;&para;&Ocirc;&raquo;°&iquest;ò
    if(ok)
    {
    newdir.dirname = newdirname.getText();
    }
    return ok;
    }//-----------------------------------------------------------------------------------------    private JButton okButton;
        private JButton cancelButton;
        private boolean ok;
        private JTextField newdirname;
    }还fix了删除后left tree没更新的bug.注意:
    targetDir.delete();
                    textArea.setText("Delete Directory " + targetDir);
                    TreeNode tn=selectedNode.getParent();
                    if(tn != null)
                    model.removeNodeFromParent(selectedNode);
                    model.nodeChanged(tn);
                    return;
      

  4.   

    十分感谢你的帮忙!能给我你的OICQ号码吗?
      

  5.   

    10828539
    但我一般不用,因为公司1080出不去。现在我用拨号所以我就开开吧。
    我一般用msn工作时([email protected]
      

  6.   

    lusxiao(lusxiao)您改的相当准确,我想知道您是怎样调试的,我可能就是不懂调试的技巧
    还有,我补充两句:用model.removeNodeFromParent(),model.insertNodeInto(),等等,它会自动通知树视图,并使之发生改变。(这是DefaultTreeModel的好处)。所以不需要加上model.nodeChanged(tn),model.nodeChanged()方法是用于保持节点结构不变,而改变用户对象时调用的方法。(基本上摘自《Java2核心技术----高级特性》)
      

  7.   

    但是我不知道为什么原来的程序我删除目录后,left就是不刷新。我机器慢?所以想都没想就加了那一句。见笑了。
      

  8.   

    调试的技巧需要大量的编程经验。
    不知你有没有兴趣:http://www.csdn.net/expert/topic/309/309124.shtm
      

  9.   

    先再又试了一下。好像是可以的。当时可能看错了。又急着贴代码。就没多想。我swing的知识有限。见笑了。