Swing Components Java

// 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;
  }
}