谁能帮我解决这里添加目录时出现的ArrayIndexOutOfBoundsException? 我用时没有ArrayIndexOutOfBoundsException 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我发现在删除一个目录后,再添加时在做DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();后selectedNode.getChildCount()返回正确值的两倍。所以model.insertNodeInto(newNode,selectedNode,selectedNode.getChildCount());就错了。xx > xx前面就是selectedNode.getChildCount(),后面是当前model里的值。如果你用model.insertNodeInto(newNode,selectedNode,0);就会发现错误。我还在努力调试。但我对swing的熟悉程度估计跟你一样我也只知道这些:)。看看别的高手能不能帮你。 sorry,没有看仔细你的程序。这是个逻辑错误。当你删除目录后,public void valueChanged(TreeSelectionEvent event)将被调用。又重新装入了一边目录。所以会有两倍内容的情况。你应该先p.removeAllChildren();在作你的代码。 所有的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 modetree.addTreeSelectionListener(this);int mode = TreeSelectionModel.SINGLE_TREE_SELECTION;tree.getSelectionModel().setSelectionMode(mode);model.setAsksAllowsChildren(true); //Ö»ÓÐÊÖ¶¯ÔÊÐíµÄ½Úµã¿ÉÒÔ±íʾΪҳ½Úµã//this text area holds the current directorytextArea = 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) //ÅжÏÊÇ·ñΪҳ½Úµã£¬µ±ÎªÎļþ¶ø²»ÊÇÎļþ¼Ðʱ£¬·µ»Øtrue£¬·ñÔò·µ»Øfalse {return n.isFile();}//------------------------------------------------------------------------------------------------------public void Explorer2(DefaultMutableTreeNode p) //¼ì²âĿ¼µÄ×îºÃ·½·¨{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; //ÔÝʱµÄĿ¼½Úµã±äÁ¿private DefaultMutableTreeNode tempLeaf; //ÔÝʱµÄÒ³½Úµã±äÁ¿private DefaultTreeModel model;private JTree tree;private JTextArea textArea;private JButton AddDir; //Ìí¼ÓĿ¼private JButton Delete; //ɾ³ýĿ¼private NewDirDialog newDialog; //¶Ô»°¿ò}//=========================================================================================/*==================================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); //ÉèÖöԻ°¿òµÄ³õʼÄÚÈÝok = false;show(); //ÏÔʾ¶Ô»°¿ò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; 十分感谢你的帮忙!能给我你的OICQ号码吗? 10828539但我一般不用,因为公司1080出不去。现在我用拨号所以我就开开吧。我一般用msn工作时([email protected]) lusxiao(lusxiao)您改的相当准确,我想知道您是怎样调试的,我可能就是不懂调试的技巧还有,我补充两句:用model.removeNodeFromParent(),model.insertNodeInto(),等等,它会自动通知树视图,并使之发生改变。(这是DefaultTreeModel的好处)。所以不需要加上model.nodeChanged(tn),model.nodeChanged()方法是用于保持节点结构不变,而改变用户对象时调用的方法。(基本上摘自《Java2核心技术----高级特性》) 但是我不知道为什么原来的程序我删除目录后,left就是不刷新。我机器慢?所以想都没想就加了那一句。见笑了。 调试的技巧需要大量的编程经验。不知你有没有兴趣:http://www.csdn.net/expert/topic/309/309124.shtm 先再又试了一下。好像是可以的。当时可能看错了。又急着贴代码。就没多想。我swing的知识有限。见笑了。 2进制在内存中存储 疑问!!! appletviewer运行程序后不能显示内容!! 关于生产者消费者问题 本人初學 XML 有個問題不知道怎麼解決﹐解決後立刻給分﹐謝謝幫忙啊 java application 中怎么点击一连接打开一网页 求Juilder5注册码? 那里有中文版的java函数库 请问怎样用jprogressbar监视一个独立线程的执行情况? android编程遇到的一个代码,请问double后面的...是什么意思? 各位大虾高抬贵手帮帮菜鸟头儿头儿吧!! jbuilder5大家的机器都需要多长时间才能启动?
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
后selectedNode.getChildCount()返回正确值的两倍。
所以
model.insertNodeInto(newNode,selectedNode,selectedNode.getChildCount());
就错了。
xx > xx前面就是selectedNode.getChildCount(),后面是当前model里的值。
如果你用model.insertNodeInto(newNode,selectedNode,0);就会发现错误。我还在努力调试。但我对swing的熟悉程度估计跟你一样我也只知道这些:)。
看看别的高手能不能帮你。
这是个逻辑错误。
当你删除目录后,public void valueChanged(TreeSelectionEvent event)
将被调用。又重新装入了一边目录。所以会有两倍内容的情况。
你应该先
p.removeAllChildren();
在作你的代码。
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) //ÅжÏÊÇ·ñΪҳ½Úµã£¬µ±ÎªÎļþ¶ø²»ÊÇÎļþ¼Ðʱ£¬·µ»Øtrue£¬·ñÔò·µ»Øfalse
{
return n.isFile();
}//------------------------------------------------------------------------------------------------------public void Explorer2(DefaultMutableTreeNode p) //¼ì²âĿ¼µÄ×îºÃ·½·¨
{
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; //ÔÝʱµÄĿ¼½Úµã±äÁ¿
private DefaultMutableTreeNode tempLeaf; //ÔÝʱµÄÒ³½Úµã±äÁ¿
private DefaultTreeModel model;
private JTree tree;
private JTextArea textArea;
private JButton AddDir; //Ìí¼ÓĿ¼
private JButton Delete; //ɾ³ýĿ¼
private NewDirDialog newDialog; //¶Ô»°¿ò
}//=========================================================================================/*==================================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); //ÉèÖöԻ°¿òµÄ³õʼÄÚÈÝ
ok = false;
show(); //ÏÔʾ¶Ô»°¿ò
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;
但我一般不用,因为公司1080出不去。现在我用拨号所以我就开开吧。
我一般用msn工作时([email protected])
还有,我补充两句:用model.removeNodeFromParent(),model.insertNodeInto(),等等,它会自动通知树视图,并使之发生改变。(这是DefaultTreeModel的好处)。所以不需要加上model.nodeChanged(tn),model.nodeChanged()方法是用于保持节点结构不变,而改变用户对象时调用的方法。(基本上摘自《Java2核心技术----高级特性》)
不知你有没有兴趣:http://www.csdn.net/expert/topic/309/309124.shtm