Mega Code Archive

 
Categories / Java / Swing Components
 

Invisible Node Tree Example

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Enumeration; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.UIManager; import javax.swing.border.TitledBorder; 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 01/12/99  */ public class InvisibleNodeTreeExample extends JFrame {   public InvisibleNodeTreeExample() {     super("InvisibleNode TreeExample");     String[] strs = { "swing", // 0         "platf", // 1         "basic", // 2         "metal", // 3         "JTree" }; // 4     InvisibleNode[] nodes = new InvisibleNode[strs.length];     for (int i = 0; i < strs.length; i++) {       nodes[i] = new InvisibleNode(strs[i]);     }     nodes[0].add(nodes[1]);     nodes[1].add(nodes[2]);     nodes[1].add(nodes[3]);     nodes[0].add(nodes[4]);     nodes[3].setVisible(false);     InvisibleTreeModel ml = new InvisibleTreeModel(nodes[0]);     ml.activateFilter(true);     JTree tree = new JTree(ml);     tree.setCellRenderer(new 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);         if (!((InvisibleNode) value).isVisible()) {           setForeground(Color.yellow);         }         return this;       }     });     JScrollPane sp = new JScrollPane(tree);     ModePanel mp = new ModePanel(ml);     ButtonPanel bp = new ButtonPanel(tree);     Box box_right = new Box(BoxLayout.Y_AXIS);     box_right.add(mp);     box_right.add(bp);     Box box = new Box(BoxLayout.X_AXIS);     box.add(sp);     box.add(Box.createVerticalGlue());     box.add(box_right);     getContentPane().add(box, BorderLayout.CENTER);   }   class ModePanel extends JPanel {     ModePanel(final InvisibleTreeModel model) {       setLayout(new GridLayout(2, 1));       setBorder(new TitledBorder("View Mode"));       ButtonGroup group = new ButtonGroup();       JRadioButton b_all = new JRadioButton("all");       JRadioButton b_hide = new JRadioButton("hide");       add(b_all);       add(b_hide);       group.add(b_all);       group.add(b_hide);       b_all.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           if (model.isActivatedFilter()) {             model.activateFilter(false);             model.reload();           }         }       });       b_hide.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           if (!model.isActivatedFilter()) {             model.activateFilter(true);             model.reload();           }         }       });       b_hide.setSelected(true);     }   }   class ButtonPanel extends JPanel {     ButtonPanel(final JTree tree) {       setLayout(new GridLayout(2, 1));       setBorder(new TitledBorder("Change Node"));       JButton b_visible = new JButton("Visible");       JButton b_invisible = new JButton("Invisible");       //b_invisible.setForeground(Color.yellow);       add(b_visible);       add(b_invisible);       b_visible.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           setNodeVisible(tree, true);         }       });       b_invisible.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent e) {           setNodeVisible(tree, false);         }       });     }     private void setNodeVisible(final JTree tree, boolean isVisible) {       DefaultTreeModel model = (DefaultTreeModel) tree.getModel();       TreePath[] path = tree.getSelectionPaths();       InvisibleNode node = null;       for (int i = 0; i < path.length; i++) {         node = (InvisibleNode) path[i].getLastPathComponent();         if (!(node == model.getRoot())) {           node.setVisible(isVisible);         } else {           System.out.println("refused: root node");         }       }       if (path.length == 1) {         model.nodeChanged(node);       } else {         model.reload();       }     }   }   public static void main(String args[]) {     try {         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");     } catch (Exception evt) {}        InvisibleNodeTreeExample frame = new InvisibleNodeTreeExample();     frame.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     frame.setSize(300, 180);     frame.setVisible(true);   } } class InvisibleTreeModel extends DefaultTreeModel {   protected boolean filterIsActive;   public InvisibleTreeModel(TreeNode root) {     this(root, false);   }   public InvisibleTreeModel(TreeNode root, boolean asksAllowsChildren) {     this(root, false, false);   }   public InvisibleTreeModel(TreeNode root, boolean asksAllowsChildren,       boolean filterIsActive) {     super(root, asksAllowsChildren);     this.filterIsActive = filterIsActive;   }   public void activateFilter(boolean newValue) {     filterIsActive = newValue;   }   public boolean isActivatedFilter() {     return filterIsActive;   }   public Object getChild(Object parent, int index) {     if (filterIsActive) {       if (parent instanceof InvisibleNode) {         return ((InvisibleNode) parent).getChildAt(index,             filterIsActive);       }     }     return ((TreeNode) parent).getChildAt(index);   }   public int getChildCount(Object parent) {     if (filterIsActive) {       if (parent instanceof InvisibleNode) {         return ((InvisibleNode) parent).getChildCount(filterIsActive);       }     }     return ((TreeNode) parent).getChildCount();   } } class InvisibleNode extends DefaultMutableTreeNode {   protected boolean isVisible;   public InvisibleNode() {     this(null);   }   public InvisibleNode(Object userObject) {     this(userObject, true, true);   }   public InvisibleNode(Object userObject, boolean allowsChildren,       boolean isVisible) {     super(userObject, allowsChildren);     this.isVisible = isVisible;   }   public TreeNode getChildAt(int index, boolean filterIsActive) {     if (!filterIsActive) {       return super.getChildAt(index);     }     if (children == null) {       throw new ArrayIndexOutOfBoundsException("node has no children");     }     int realIndex = -1;     int visibleIndex = -1;     Enumeration e = children.elements();     while (e.hasMoreElements()) {       InvisibleNode node = (InvisibleNode) e.nextElement();       if (node.isVisible()) {         visibleIndex++;       }       realIndex++;       if (visibleIndex == index) {         return (TreeNode) children.elementAt(realIndex);       }     }     throw new ArrayIndexOutOfBoundsException("index unmatched");     //return (TreeNode)children.elementAt(index);   }   public int getChildCount(boolean filterIsActive) {     if (!filterIsActive) {       return super.getChildCount();     }     if (children == null) {       return 0;     }     int count = 0;     Enumeration e = children.elements();     while (e.hasMoreElements()) {       InvisibleNode node = (InvisibleNode) e.nextElement();       if (node.isVisible()) {         count++;       }     }     return count;   }   public void setVisible(boolean visible) {     this.isVisible = visible;   }   public boolean isVisible() {     return isVisible;   } }