// Purpose.  JTree, TreeExpansionListener, TreeSelectionListener, TreePath demo

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class JTreeDemo {
   public static void main( String[] args ) {
      JFrame frame = new JFrame( "JTree listeners demo" );
      frame.addWindowListener( new WindowAdapter() {
         public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } );
      frame.getContentPane().add( createTree() );
      frame.pack();
      frame.setVisible( true );
   }
   public static JPanel createTree() {
      TreeNode root = buildTree( "top", 1, 1 );
      JTree tree = new JTree( new DefaultTreeModel(root) );

      tree.addTreeExpansionListener( new TreeExpansionListener() {
         public void treeExpanded( TreeExpansionEvent e ) {
            System.out.println( "xpanded --- " + expandPath(e.getPath()) ); }
         public void treeCollapsed( TreeExpansionEvent e ) {
            System.out.println( "collapsed - " + expandPath(e.getPath()) ); }
      } );
      tree.addTreeSelectionListener( new TreeSelectionListener() {
         public void valueChanged( TreeSelectionEvent e ) {
            // on a collapse req, ignore the event coming from the current child
            if ( ! e.isAddedPath()) return;
            System.out.println( "selected -- " + expandPath(e.getPath()) ); }
      } );
      
      JScrollPane tScroll = new JScrollPane( tree );
      tScroll.setPreferredSize( new Dimension(250,200) );
      JPanel tPanel = new JPanel();
      tPanel.add( tScroll );
      return tPanel;
   }
   public static DefaultMutableTreeNode buildTree(String s, int num, int level){
      DefaultMutableTreeNode t = new DefaultMutableTreeNode( s + num );
      String str = (s.equals("top") ? "" : s) + num;
      if ((num % 2 == 1) && (level < 4))
         for (int i = 0; i < 6; i++) t.add( buildTree( str, i, level+1 ) );
      return t;
   }
   private static String expandPath( TreePath e ) {
      Object[] parts = e.getPath();
      StringBuffer sb = new StringBuffer();
      for (int i=0; i < parts.length; i++) sb.append( parts[i] + "." );
      sb.setLength( sb.length() - 1 );
      return sb.toString();
   }
}

// xpanded --- top1.15
// xpanded --- top1.15.151
// selected -- top1.15.151.1511
// collapsed - top1.15.151
// selected -- top1.15.151
// collapsed - top1.15
// selected -- top1.15
// selected -- top1.13
// xpanded --- top1.13
