我写了一个小程序,主要是显示当前磁盘上的目录与文件
但是只要切换到NTFS格式分区,就会抛出很多异常
哪位高手来帮忙看一看吧源程序如下:
DirectoryTreeModel.java文件(定义TreeModel):
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.swing.event.*;
import javax.swing.tree.*;public class DirectoryTreeModel implements TreeModel
{
private DirectoryVariable root;
private EventListenerList listenerList = new EventListenerList(); /**
* Construct an empty tree
*/
public DirectoryTreeModel()
{
root = null;
} /**
* Set the root to a given DirectoryVariable
*/
public void setRoot( DirectoryVariable dirVariable )
{
DirectoryVariable oldRoot = dirVariable;
root = dirVariable;
fireTreeStructureChanged( oldRoot );
} public Object getRoot()
{
return root;
} public int getChildCount( Object parent )
{
return (( DirectoryVariable )parent).getSubDirs().size();
} public Object getChild( Object parent, int index )
{
ArrayList subDirs = (( DirectoryVariable )parent).getSubDirs();
File f = (File)subDirs.get( index );
return new DirectoryVariable( f.getAbsolutePath() );
} public int getIndexOfChild( Object parent, Object child )
{
int n = getChildCount( parent );
for( int i = 0; i < n; i++ )
{
if( getChild( parent, i ).equals( child ) )
{
return i;
}
}
return -1;
} public boolean isLeaf( Object node )
{
DirectoryVariable dirNode = ( DirectoryVariable )node;
File dir = new File( dirNode.toString() );
return dir.isFile();
} public void valueForPathChanged( TreePath path, Object newValue )
{
} public void addTreeModelListener( TreeModelListener l )
{
listenerList.add( TreeModelListener.class, l );
} public void removeTreeModelListener( TreeModelListener l )
{
listenerList.remove( TreeModelListener.class, l );
} protected void fireTreeStructureChanged( Object oldRoot )
{
TreeModelEvent event = new TreeModelEvent( this, new Object[] {oldRoot} );
EventListener[] listeners = listenerList.getListeners( TreeModelListener.class );
for( int i = 0; i < listeners.length; i++ )
{
((TreeModelListener)listeners[i]).treeStructureChanged( event );
}
}
}class DirectoryVariable
{
private String path;
private ArrayList subDirs; public DirectoryVariable( String aPath )
{
path = aPath;
subDirs = new ArrayList(); /**
* test whether the path is a Directory or a File
* if a Directory, get all of its subDirectory and subFiles
*/
File fileNode = new File( path );
if( fileNode.isDirectory() )
{
File[] subFile = fileNode.listFiles();
for( int i = 0; i < subFile.length; i++ )
{
subDirs.add( subFile[i] );
}
}
} public ArrayList getSubDirs()
{
return subDirs;
} public String toString()
{
return path;
}
}DirectoryTreeFrame.java文件(定义初始框架窗口):
import java.lang.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.*;public class DirectoryTreeFrame extends JFrame
{
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 300;
String defaultPath = "C:\\Documents and Settings\\1";
JPanel jPanel1 = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
JComboBox jComboBox1 = new JComboBox();
JLabel statusBar = new JLabel();
JPanel jPanel2 = new JPanel();
BorderLayout borderLayout2 = new BorderLayout();
JScrollPane jScrollPane1 = new JScrollPane();
JTree jTree1 = new JTree(); public DirectoryTreeFrame() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
jPanel1.setLayout(borderLayout1);
this.setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
jPanel2.setLayout(borderLayout2);
statusBar.setMaximumSize(new Dimension(32, 32767));
statusBar.setMinimumSize(new Dimension(32, 16));
statusBar.setOpaque(false);
statusBar.setPreferredSize(new Dimension(32, 16));
statusBar.setText("");
jComboBox1.setEditable(true);
jComboBox1.addActionListener(new DirectoryTreeFrame_jComboBox1_actionAdapter(this));
jComboBox1.addItem( defaultPath );
File[] roots = File.listRoots();
for( int i = 0; i < roots.length; i++ )
{
jComboBox1.addItem( roots[i].toString() );
}
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jComboBox1, BorderLayout.NORTH);
jPanel1.add(statusBar, BorderLayout.SOUTH);
jPanel1.add(jPanel2, BorderLayout.CENTER);
jPanel2.add(jScrollPane1, BorderLayout.CENTER);
jScrollPane1.getViewport().add(jTree1, null);
} void jComboBox1_actionPerformed(ActionEvent e) {
String dirPath = (String)jComboBox1.getSelectedItem();
File dirSelected = new File( dirPath );
if( !dirSelected.exists() )
{
dirPath = defaultPath;
JOptionPane.showMessageDialog( null, "The Directory NOT exist!" );
}
DirectoryVariable dirVariable = new DirectoryVariable( dirPath );
DirectoryTreeModel model = new DirectoryTreeModel();
model.setRoot( dirVariable );
jTree1.setModel( model );
jTree1.putClientProperty( "JTree.lineStyle", "Angled" );
}}class DirectoryTreeFrame_jComboBox1_actionAdapter implements java.awt.event.ActionListener {
DirectoryTreeFrame adaptee; DirectoryTreeFrame_jComboBox1_actionAdapter(DirectoryTreeFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jComboBox1_actionPerformed(e);
}
}DirectoryTree.java文件(实现目录树):
import java.lang.*;
import java.awt.*;
import javax.swing.*;public class DirectoryTree
{
boolean packFrame = false; /**
* Construct the application
*/
public DirectoryTree()
{
DirectoryTreeFrame frame = new DirectoryTreeFrame(); //Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if( packFrame )
{
frame.pack();
}
else
{
frame.validate();
} //Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if( frameSize.width > screenSize.width )
{
frameSize.width = screenSize.width;
}
if( frameSize.height > screenSize.height )
{
frameSize.height = screenSize.height;
}
frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2 );
frame.setVisible( true );
} /**
* Main method
*
* @param args String[]
*/
public static void main( String args[] )
{
String windowsLookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
try
{
UIManager.setLookAndFeel( windowsLookAndFeel );
}
catch( Exception e )
{
e.printStackTrace();
} new DirectoryTree();
}
}
但是只要切换到NTFS格式分区,就会抛出很多异常
哪位高手来帮忙看一看吧源程序如下:
DirectoryTreeModel.java文件(定义TreeModel):
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.swing.event.*;
import javax.swing.tree.*;public class DirectoryTreeModel implements TreeModel
{
private DirectoryVariable root;
private EventListenerList listenerList = new EventListenerList(); /**
* Construct an empty tree
*/
public DirectoryTreeModel()
{
root = null;
} /**
* Set the root to a given DirectoryVariable
*/
public void setRoot( DirectoryVariable dirVariable )
{
DirectoryVariable oldRoot = dirVariable;
root = dirVariable;
fireTreeStructureChanged( oldRoot );
} public Object getRoot()
{
return root;
} public int getChildCount( Object parent )
{
return (( DirectoryVariable )parent).getSubDirs().size();
} public Object getChild( Object parent, int index )
{
ArrayList subDirs = (( DirectoryVariable )parent).getSubDirs();
File f = (File)subDirs.get( index );
return new DirectoryVariable( f.getAbsolutePath() );
} public int getIndexOfChild( Object parent, Object child )
{
int n = getChildCount( parent );
for( int i = 0; i < n; i++ )
{
if( getChild( parent, i ).equals( child ) )
{
return i;
}
}
return -1;
} public boolean isLeaf( Object node )
{
DirectoryVariable dirNode = ( DirectoryVariable )node;
File dir = new File( dirNode.toString() );
return dir.isFile();
} public void valueForPathChanged( TreePath path, Object newValue )
{
} public void addTreeModelListener( TreeModelListener l )
{
listenerList.add( TreeModelListener.class, l );
} public void removeTreeModelListener( TreeModelListener l )
{
listenerList.remove( TreeModelListener.class, l );
} protected void fireTreeStructureChanged( Object oldRoot )
{
TreeModelEvent event = new TreeModelEvent( this, new Object[] {oldRoot} );
EventListener[] listeners = listenerList.getListeners( TreeModelListener.class );
for( int i = 0; i < listeners.length; i++ )
{
((TreeModelListener)listeners[i]).treeStructureChanged( event );
}
}
}class DirectoryVariable
{
private String path;
private ArrayList subDirs; public DirectoryVariable( String aPath )
{
path = aPath;
subDirs = new ArrayList(); /**
* test whether the path is a Directory or a File
* if a Directory, get all of its subDirectory and subFiles
*/
File fileNode = new File( path );
if( fileNode.isDirectory() )
{
File[] subFile = fileNode.listFiles();
for( int i = 0; i < subFile.length; i++ )
{
subDirs.add( subFile[i] );
}
}
} public ArrayList getSubDirs()
{
return subDirs;
} public String toString()
{
return path;
}
}DirectoryTreeFrame.java文件(定义初始框架窗口):
import java.lang.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.*;public class DirectoryTreeFrame extends JFrame
{
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 300;
String defaultPath = "C:\\Documents and Settings\\1";
JPanel jPanel1 = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
JComboBox jComboBox1 = new JComboBox();
JLabel statusBar = new JLabel();
JPanel jPanel2 = new JPanel();
BorderLayout borderLayout2 = new BorderLayout();
JScrollPane jScrollPane1 = new JScrollPane();
JTree jTree1 = new JTree(); public DirectoryTreeFrame() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
jPanel1.setLayout(borderLayout1);
this.setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
jPanel2.setLayout(borderLayout2);
statusBar.setMaximumSize(new Dimension(32, 32767));
statusBar.setMinimumSize(new Dimension(32, 16));
statusBar.setOpaque(false);
statusBar.setPreferredSize(new Dimension(32, 16));
statusBar.setText("");
jComboBox1.setEditable(true);
jComboBox1.addActionListener(new DirectoryTreeFrame_jComboBox1_actionAdapter(this));
jComboBox1.addItem( defaultPath );
File[] roots = File.listRoots();
for( int i = 0; i < roots.length; i++ )
{
jComboBox1.addItem( roots[i].toString() );
}
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jComboBox1, BorderLayout.NORTH);
jPanel1.add(statusBar, BorderLayout.SOUTH);
jPanel1.add(jPanel2, BorderLayout.CENTER);
jPanel2.add(jScrollPane1, BorderLayout.CENTER);
jScrollPane1.getViewport().add(jTree1, null);
} void jComboBox1_actionPerformed(ActionEvent e) {
String dirPath = (String)jComboBox1.getSelectedItem();
File dirSelected = new File( dirPath );
if( !dirSelected.exists() )
{
dirPath = defaultPath;
JOptionPane.showMessageDialog( null, "The Directory NOT exist!" );
}
DirectoryVariable dirVariable = new DirectoryVariable( dirPath );
DirectoryTreeModel model = new DirectoryTreeModel();
model.setRoot( dirVariable );
jTree1.setModel( model );
jTree1.putClientProperty( "JTree.lineStyle", "Angled" );
}}class DirectoryTreeFrame_jComboBox1_actionAdapter implements java.awt.event.ActionListener {
DirectoryTreeFrame adaptee; DirectoryTreeFrame_jComboBox1_actionAdapter(DirectoryTreeFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jComboBox1_actionPerformed(e);
}
}DirectoryTree.java文件(实现目录树):
import java.lang.*;
import java.awt.*;
import javax.swing.*;public class DirectoryTree
{
boolean packFrame = false; /**
* Construct the application
*/
public DirectoryTree()
{
DirectoryTreeFrame frame = new DirectoryTreeFrame(); //Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if( packFrame )
{
frame.pack();
}
else
{
frame.validate();
} //Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if( frameSize.width > screenSize.width )
{
frameSize.width = screenSize.width;
}
if( frameSize.height > screenSize.height )
{
frameSize.height = screenSize.height;
}
frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2 );
frame.setVisible( true );
} /**
* Main method
*
* @param args String[]
*/
public static void main( String args[] )
{
String windowsLookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
try
{
UIManager.setLookAndFeel( windowsLookAndFeel );
}
catch( Exception e )
{
e.printStackTrace();
} new DirectoryTree();
}
}
{
path = aPath;
subDirs = new ArrayList(); /**
* test whether the path is a Directory or a File
* if a Directory, get all of its subDirectory and subFiles
*/
File fileNode = new File( path );
if( fileNode.isDirectory() )
{
File[] subFile = fileNode.listFiles();
if (subFile == null)
return;
for( int i = 0; i < subFile.length; i++ )
{
subDirs.add(subFile[i]);
}
}
}当然,System Volume Information 中的东西就看不到了,这应该是合理的。
正解!!!