Mega Code Archive

 
Categories / Java / Swing Components
 

Animated Icon Tree Example 2

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html import java.awt.BorderLayout; import java.awt.Component; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.ImageObserver; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; /**  * @version 1.0 06/20/99  */ public class AnimatedIconTreeExample2 extends JFrame {   final static String CAT = "cat";   final static String DOG = "dog";   public AnimatedIconTreeExample2() {     super("AnimatedIconTreeExample2");     String[] strs = { "CARNIVORA", // 0         "Felidae", // 1         "Acinonyx jutatus  (cheetah)", // 2         "Panthera leo  (lion)", // 3         "Canidae", // 4         "Canis lupus  (wolf)", // 5         "Lycaon pictus  (lycaon)", // 6         "Vulpes Vulpes  (fox)" }; // 7     IconNode[] nodes = new IconNode[strs.length];     for (int i = 0; i < strs.length; i++) {       nodes[i] = new IconNode(strs[i]);     }     nodes[0].add(nodes[1]);     nodes[0].add(nodes[4]);     nodes[1].add(nodes[2]);     nodes[1].add(nodes[3]);     nodes[4].add(nodes[5]);     nodes[4].add(nodes[6]);     nodes[4].add(nodes[7]);     // If you want to share the ImageIcon with a node.     nodes[2].setIconName(CAT);     nodes[3].setIconName(CAT);     nodes[5].setIconName(DOG);     nodes[6].setIconName(DOG);     nodes[7].setIconName(DOG);     Hashtable icons = new Hashtable();     icons.put(CAT, new ImageIcon("rntsoftAnimation.gif"));     icons.put(DOG, new ImageIcon("rntsoftAnimation.gif"));     JTree tree = new JTree(nodes[0]);     tree.putClientProperty("JTree.icons", icons);     tree.setCellRenderer(new IconNodeRenderer());     setImageObserver(tree, nodes, icons);     JScrollPane sp = new JScrollPane(tree);     getContentPane().add(sp, BorderLayout.CENTER);   }   private void setImageObserver(JTree tree, IconNode[] nodes, Hashtable icons) {     Hashtable observers = new Hashtable();     for (int i = 0; i < nodes.length; i++) {       ImageIcon icon = (ImageIcon) nodes[i].getIcon();       if (icon != null) {         Vector repaintNodes = new Vector();         repaintNodes.addElement(nodes[i]);         icon             .setImageObserver(new NodeImageObserver(tree,                 repaintNodes));       } else {         String iconName = nodes[i].getIconName();         if (iconName != null) {           Vector repaintNodes = (Vector) observers.get(iconName);           if (repaintNodes == null) {             repaintNodes = new Vector();             observers.put(iconName, repaintNodes);           }           repaintNodes.addElement(nodes[i]);         }       }     }     Enumeration e = observers.keys();     while (e.hasMoreElements()) {       String iconName = (String) e.nextElement();       Vector repaintNodes = (Vector) observers.get(iconName);       ImageIcon icon = (ImageIcon) icons.get(iconName);       icon.setImageObserver(new NodeImageObserver(tree, repaintNodes));     }   }   class NodeImageObserver implements ImageObserver {     JTree tree;     DefaultTreeModel model;     Vector nodes;     NodeImageObserver(JTree tree, Vector nodes) {       this.tree = tree;       this.model = (DefaultTreeModel) tree.getModel();       this.nodes = nodes;     }     public boolean imageUpdate(Image img, int flags, int x, int y, int w,         int h) {       if ((flags & (FRAMEBITS | ALLBITS)) != 0) {         Enumeration e = nodes.elements();         while (e.hasMoreElements()) {           TreeNode node = (TreeNode) e.nextElement();           TreePath path = new TreePath(model.getPathToRoot(node));           Rectangle rect = tree.getPathBounds(path);           if (rect != null) {             tree.repaint(rect);           }         }       }       return (flags & (ALLBITS | ABORT)) == 0;     }   }   public static void main(String args[]) {     try {         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");     } catch (Exception evt) {}        AnimatedIconTreeExample2 frame = new AnimatedIconTreeExample2();     frame.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     frame.setSize(280, 200);     frame.setVisible(true);   } } class IconNodeRenderer extends DefaultTreeCellRenderer {   public Component getTreeCellRendererComponent(JTree tree, Object value,       boolean sel, boolean expanded, boolean leaf, int row,       boolean hasFocus) {     super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,         row, hasFocus);     Icon icon = ((IconNode) value).getIcon();     if (icon == null) {       Hashtable icons = (Hashtable) tree.getClientProperty("JTree.icons");       String name = ((IconNode) value).getIconName();       if ((icons != null) && (name != null)) {         icon = (Icon) icons.get(name);         if (icon != null) {           setIcon(icon);         }       }     } else {       setIcon(icon);     }     return this;   } } class IconNode extends DefaultMutableTreeNode {   protected Icon icon;   protected String iconName;   public IconNode() {     this(null);   }   public IconNode(Object userObject) {     this(userObject, true, null);   }   public IconNode(Object userObject, boolean allowsChildren, Icon icon) {     super(userObject, allowsChildren);     this.icon = icon;   }   public void setIcon(Icon icon) {     this.icon = icon;   }   public Icon getIcon() {     return icon;   }   public String getIconName() {     if (iconName != null) {       return iconName;     } else {       String str = userObject.toString();       int index = str.lastIndexOf(".");       if (index != -1) {         return str.substring(++index);       } else {         return null;       }     }   }   public void setIconName(String name) {     iconName = name;   } }