// DisabledNodeTreeExample.java /* (swing1.1.1beta2) swing#1331 */ //package jp.gr.java_conf.tame.swing.examples; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; import javax.swing.event.*; import javax.swing.border.*; import jp.gr.java_conf.tame.swing.icon.*; import jp.gr.java_conf.tame.swing.tree.*; /** * @version 1.1 04/30/99 */ public class DisabledNodeTreeExample extends JFrame { public DisabledNodeTreeExample() { super("DisabledNode TreeExample"); String[] strs = {"swing", // 0 "plaf", // 1 "basic", // 2 "metal", // 3 "JTree", // 4 "plaf", // 5 "motif"}; // 6 DisabledNode[] nodes = new DisabledNode[strs.length]; for (int i=0;i<strs.length;i++) { nodes[i] = new DisabledNode(strs[i]); } nodes[0].add(nodes[1]); nodes[1].add(nodes[2]); nodes[1].add(nodes[3]); nodes[0].add(nodes[4]); nodes[0].add(nodes[5]); nodes[5].add(nodes[6]); nodes[3].setEnabled(false); nodes[5].setEnabled(false); final JTree tree = new JTree( nodes[0] ) { public boolean isPathEditable(TreePath path) { DisabledNode node = (DisabledNode)path.getLastPathComponent(); if (node.isEnabled()) { return isEditable(); } else { return false; } } }; DisabledRenderer renderer = new DisabledRenderer(); renderer.setDisabledLeafIcon(new DisabledLeafIcon()); renderer.setDisabledOpenIcon(new DisabledFolderIcon()); renderer.setDisabledClosedIcon(new DisabledFolderIcon()); tree.setCellRenderer(renderer); tree.setEditable(true); JScrollPane sp = new JScrollPane(tree); ButtonPanel bp = new ButtonPanel(tree); getContentPane().add(sp, BorderLayout.CENTER); getContentPane().add(bp, BorderLayout.EAST); } class ButtonPanel extends JPanel { JTree tree; DefaultTreeModel model; ButtonPanel(JTree tree) { this.tree = tree; model = (DefaultTreeModel)tree.getModel(); setLayout(new GridLayout(2,1)); setBorder(new TitledBorder("Change Node")); JButton enabledButton = new JButton("Enabled"); JButton disabledButton = new JButton("Disabled"); add(enabledButton); add(disabledButton); enabledButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setNodeEnabled( true ); } }); disabledButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setNodeEnabled( false ); } }); } private void setNodeEnabled(boolean enabled) { TreePath[] path = tree.getSelectionPaths(); if (path == null) return; DisabledNode node = null; for (int i=0;i<path.length;i++) { node = (DisabledNode)path[i].getLastPathComponent(); //if (node.isRoot()) { // System.out.println("refused: root node"); //} else { int beforeChildCount = node.getChildCount(); node.setEnabled(enabled); int afterChildCount = node.getChildCount(); if (beforeChildCount == afterChildCount) { model.nodeChanged(node); } else { model.reload(); } //} } } } public static void main(String args[]) { DisabledNodeTreeExample frame = new DisabledNodeTreeExample(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.setSize(300, 180); frame.setVisible(true); } } ==========================================================
// DisabledRenderer.java /* (swing1.1.1beta2) */ package jp.gr.java_conf.tame.swing.tree; import java.awt.*; import javax.swing.*; import javax.swing.tree.*; import jp.gr.java_conf.tame.swing.icon.*; /** * @version 1.1 04/30/99 */ public class DisabledRenderer extends DefaultTreeCellRenderer { protected Icon disabledLeafIcon; protected Icon disabledOpenIcon; protected Icon disabledClosedIcon; public DisabledRenderer() { this( new GraydIcon(UIManager.getIcon("Tree.leafIcon")), new GraydIcon(UIManager.getIcon("Tree.openIcon")), new GraydIcon(UIManager.getIcon("Tree.closedIcon")) ); } public DisabledRenderer(Icon leafIcon, Icon openIcon, Icon closedIcon) { setDisabledLeafIcon(leafIcon); setDisabledOpenIcon(openIcon); setDisabledClosedIcon(closedIcon); } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus); setText(stringValue); if (sel) { setForeground(getTextSelectionColor()); } else { setForeground(getTextNonSelectionColor()); } boolean treeIsEnabled = tree.isEnabled(); boolean nodeIsEnabled = ((DisabledNode)value).isEnabled(); boolean isEnabled = (treeIsEnabled && nodeIsEnabled); setEnabled(isEnabled); if (isEnabled) { selected = sel; if (leaf) { setIcon(getLeafIcon()); } else if (expanded) { setIcon(getOpenIcon()); } else { setIcon(getClosedIcon()); } } else { selected = false; if (leaf) { if (nodeIsEnabled) { setDisabledIcon(getLeafIcon()); } else { setDisabledIcon(disabledLeafIcon); } } else if (expanded) { if (nodeIsEnabled) { setDisabledIcon(getOpenIcon()); } else { setDisabledIcon(disabledOpenIcon); } } else { if (nodeIsEnabled) { setDisabledIcon(getClosedIcon()); } else { setDisabledIcon(disabledClosedIcon); } } } return this; } public void setDisabledLeafIcon(Icon icon) { disabledLeafIcon = icon; } public void setDisabledOpenIcon(Icon icon) { disabledOpenIcon = icon; } public void setDisabledClosedIcon(Icon icon) { disabledClosedIcon = icon; } } ===============================================
// DisabledNode.java /* (swing1.1.1beta2) */ package jp.gr.java_conf.tame.swing.tree; import javax.swing.tree.*; /** * @version 1.0 04/27/99 */ public class DisabledNode extends DefaultMutableTreeNode { protected boolean enabled; public DisabledNode() { this(null, true, true); } public DisabledNode(Object userObject) { this(userObject, true, true); } public DisabledNode(Object userObject, boolean allowsChildren) { this(userObject, allowsChildren, true); } public DisabledNode(Object userObject, boolean allowsChildren , boolean enabled) { super(userObject, allowsChildren); this.enabled = enabled; } public int getChildCount() { if (enabled) { return super.getChildCount(); } else { return 0; } } public boolean isLeaf() { return (super.getChildCount() == 0); } public void setEnabled(boolean enabled) { this.enabled = enabled; } public boolean isEnabled() { return enabled; } } ===================================================
// DisabledLeafIcon.java // (swing1.1.1beta2) package jp.gr.java_conf.tame.swing.icon; import java.awt.*; import javax.swing.*; import javax.swing.plaf.metal.*; /** * @@version 1.0 04/28/99 */ public class DisabledLeafIcon implements Icon { int width = 16; int height = 16; int additionalHeight = 4; public void paintIcon(Component c, Graphics g, int x, int y) { int right = width - 1; int bottom = height + 1; g.setColor(c.getBackground()); g.fillRect(0,0, width, getIconHeight()); // Draw frame g.setColor( MetalLookAndFeel.getControlDisabled() ); g.drawLine( 2, 2, 2, bottom ); // left g.drawLine( 2, 2, right -4, 2 ); // top g.drawLine( 2,bottom, right -1, bottom ); // bottom g.drawLine( right -1, 8, right -1, bottom ); // right g.drawLine( right -6, 4, right -2, 8 ); // slant 1 g.drawLine( right -5, 3, right -4, 3 ); // part of slant 2 g.drawLine( right -3, 4, right -3, 5 ); // part of slant 2 g.drawLine( right -2, 6, right -2, 7 ); // part of slant 2 } public int getIconWidth() { return width; } public int getIconHeight() { return height + additionalHeight; } } =======================================================
// DisabledLeafIcon.java // (swing1.1.1beta2) package jp.gr.java_conf.tame.swing.icon; import java.awt.*; import javax.swing.*; import javax.swing.plaf.metal.*; /** * @@version 1.0 04/28/99 */ public class DisabledFolderIcon implements Icon { int width = 16; int height = 16; int additionalHeight = 2; public void paintIcon(Component c, Graphics g, int x, int y) { int right = width - 1; int bottom = height - 2; g.setColor(c.getBackground()); g.fillRect(0,0, width, getIconHeight()); // Draw tab g.setColor( MetalLookAndFeel.getControlDisabled() ); g.drawLine( right -5, 2, right , 2 ); g.drawLine( right -6, 3, right -6, 4 ); g.drawLine( right , 3, right , 4 ); // Draw outline g.setColor( MetalLookAndFeel.getControlDisabled() ); g.drawLine( 0, 5, 0, bottom ); // left side g.drawLine( 1, 4, right -7, 4 ); // first part of top g.drawLine( right -6, 5, right -1, 5 ); // second part of top g.drawLine( right , 4, right , bottom ); // right side g.drawLine( 0, bottom, right , bottom ); // bottom } public int getIconWidth() { return width; } public int getIconHeight() { return height + additionalHeight; } } ===================================================
package jp.gr.java_conf.tame.swing.icon; import java.awt.*; import java.awt.image.*; import javax.swing.*; /** * @version 1.0 04/30/99 */ public class GraydIcon implements Icon { Icon icon; Image image; public GraydIcon(Icon icon) { this.icon = icon; } public void paintIcon(Component c, Graphics g, int x, int y) { if (image == null) { Image orgImage = c.createImage(getIconWidth(), getIconHeight()); Graphics imageG = orgImage.getGraphics(); Color background = c.getBackground(); imageG.setColor(background); imageG.fillRect(0,0, getIconWidth(), getIconHeight() ); icon.paintIcon(c,imageG,x,y); ImageFilter colorfilter = new GrayFilter(); image = c.createImage( new FilteredImageSource(orgImage.getSource(),colorfilter)); } g.drawImage(image, x, y, null); } public int getIconWidth() { return icon.getIconWidth(); } public int getIconHeight() { return icon.getIconHeight(); } class GrayFilter extends RGBImageFilter { public GrayFilter() { // If I set ture, black is gone?! //canFilterIndexColorModel = true; } public int filterRGB(int x, int y, int rgb) { int r = (rgb & 0xff0000) >> 16; int g = (rgb & 0x00ff00) >> 8; int b = (rgb & 0x0000ff); int iy = (int)(r + g + b)/3; iy = Math.min(255, iy); return ((rgb & 0xff000000) | (iy << 16) | (iy << 8) | iy); } } }