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