// Purpose.  JTree demo   [source: Flanagan97b, p376]

import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;   // TreeModelListener
import java.io.*;

public class JTreeDirectory {

   public static void main( String[] args ) {

      TreeNode root = buildTree( new File( args[0] ) );

      JTree tree = new JTree( new DefaultTreeModel( root ) );
      tree.setEditable( true );

      tree.getModel().addTreeModelListener( new TreeModelListener() {
         public void treeNodesChanged( TreeModelEvent e ) {
            Object[] children = e.getChildren();
            System.out.println( children[0] );
         }
         public void treeNodesInserted( TreeModelEvent e )    { }
         public void treeNodesRemoved( TreeModelEvent e )     { }
         public void treeStructureChanged( TreeModelEvent e ) { }
      } );

      JFrame frame = new JFrame( "JTree recursive directory demo" );
      frame.addWindowListener( new WindowAdapter() {
         public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } );
      frame.getContentPane().add( new JScrollPane( tree ) );
      frame.setSize( 300, 300 );
      frame.setVisible( true );
   }

   // This method recursively creates a hierarchy of TreeNode objects that
   // represent the files and subdirectories of the specified directory

   static DefaultMutableTreeNode buildTree( File f ) {

      DefaultMutableTreeNode node = new DefaultMutableTreeNode( f.getName() );

      if (f.isDirectory()) {
         String[] list = f.list();
         for (int i = 0; i < list.length; i++) 
            node.add( buildTree( new File( f, list[i] )));
      }
      return node;
   }
}
