| /* |
| * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * - Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * - Neither the name of Oracle nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /* |
| * This source code is provided to illustrate the usage of a given feature |
| * or technique and has been deliberately simplified. Additional steps |
| * required for a production-quality application, such as security checks, |
| * input validation and proper error handling, might not be present in |
| * this sample code. |
| */ |
| |
| |
| |
| import javax.swing.Icon; |
| import javax.swing.ImageIcon; |
| import javax.swing.JLabel; |
| import javax.swing.JTree; |
| import javax.swing.tree.TreeCellRenderer; |
| import javax.swing.tree.DefaultMutableTreeNode; |
| import java.awt.Component; |
| import java.awt.Color; |
| import java.awt.Font; |
| import java.awt.Graphics; |
| import javax.swing.UIManager; |
| |
| |
| @SuppressWarnings("serial") |
| public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer { |
| |
| /** Font used if the string to be displayed isn't a font. */ |
| protected static Font defaultFont; |
| /** Icon to use when the item is collapsed. */ |
| protected static ImageIcon collapsedIcon; |
| /** Icon to use when the item is expanded. */ |
| protected static ImageIcon expandedIcon; |
| /** Color to use for the background when selected. */ |
| protected static final Color SELECTED_BACKGROUND_COLOR; |
| |
| static { |
| if ("Nimbus".equals(UIManager.getLookAndFeel().getName())) { |
| SELECTED_BACKGROUND_COLOR = new Color(0, 0, |
| 0, 0); |
| } else { |
| SELECTED_BACKGROUND_COLOR = Color.YELLOW; |
| } |
| try { |
| defaultFont = new Font("SansSerif", 0, 12); |
| } catch (Exception e) { |
| } |
| try { |
| collapsedIcon = new ImageIcon(SampleTreeCellRenderer.class. |
| getResource("/resources/images/collapsed.gif")); |
| expandedIcon = new ImageIcon(SampleTreeCellRenderer.class. |
| getResource("/resources/images/expanded.gif")); |
| } catch (Exception e) { |
| System.out.println("Couldn't load images: " + e); |
| } |
| } |
| /** Whether or not the item that was last configured is selected. */ |
| protected boolean selected; |
| |
| /** |
| * This is messaged from JTree whenever it needs to get the size |
| * of the component or it wants to draw it. |
| * This attempts to set the font based on value, which will be |
| * a TreeNode. |
| */ |
| public Component getTreeCellRendererComponent(JTree tree, Object value, |
| boolean selected, boolean expanded, |
| boolean leaf, int row, |
| boolean hasFocus) { |
| String stringValue = tree.convertValueToText(value, selected, |
| expanded, leaf, row, hasFocus); |
| |
| /* Set the text. */ |
| setText(stringValue); |
| /* Tooltips used by the tree. */ |
| setToolTipText(stringValue); |
| |
| /* Set the image. */ |
| if (expanded) { |
| setIcon(expandedIcon); |
| } else if (!leaf) { |
| setIcon(collapsedIcon); |
| } else { |
| setIcon(null); |
| } |
| |
| /* Set the color and the font based on the SampleData userObject. */ |
| SampleData userObject = (SampleData) ((DefaultMutableTreeNode) value). |
| getUserObject(); |
| if (hasFocus) { |
| setForeground(UIManager.getColor("Tree.selectionForeground")); |
| } else { |
| setForeground(userObject.getColor()); |
| } |
| if (userObject.getFont() == null) { |
| setFont(defaultFont); |
| } else { |
| setFont(userObject.getFont()); |
| } |
| |
| /* Update the selected flag for the next paint. */ |
| this.selected = selected; |
| |
| return this; |
| } |
| |
| /** |
| * paint is subclassed to draw the background correctly. JLabel |
| * currently does not allow backgrounds other than white, and it |
| * will also fill behind the icon. Something that isn't desirable. |
| */ |
| @Override |
| public void paint(Graphics g) { |
| Color bColor; |
| Icon currentI = getIcon(); |
| |
| if (selected) { |
| bColor = SELECTED_BACKGROUND_COLOR; |
| } else if (getParent() != null) /* Pick background color up from parent (which will come from |
| the JTree we're contained in). */ { |
| bColor = getParent().getBackground(); |
| } else { |
| bColor = getBackground(); |
| } |
| g.setColor(bColor); |
| if (currentI != null && getText() != null) { |
| int offset = (currentI.getIconWidth() + getIconTextGap()); |
| |
| if (getComponentOrientation().isLeftToRight()) { |
| g.fillRect(offset, 0, getWidth() - 1 - offset, |
| getHeight() - 1); |
| } else { |
| g.fillRect(0, 0, getWidth() - 1 - offset, getHeight() - 1); |
| } |
| } else { |
| g.fillRect(0, 0, getWidth() - 1, getHeight() - 1); |
| } |
| super.paint(g); |
| } |
| } |