Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Tree with custom icon

/*  * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  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 Sun Microsystems 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.  */ /**  * A 1.4 application that requires the following additional files:  *   TreeDemoHelp.html  *    arnold.html  *    bloch.html  *    chan.html  *    jls.html  *    swingtutorial.html  *    tutorial.html  *    tutorialcont.html  *    vm.html  */ import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.io.IOException; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeSelectionModel; public class TreeIconDemo2 extends JPanel implements TreeSelectionListener {   private JEditorPane htmlPane;   private JTree tree;   private URL helpURL;   private static boolean DEBUG = false;   public TreeIconDemo2() {     super(new GridLayout(1, 0));     // Create the nodes.     DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java Series");     createNodes(top);     // Create a tree that allows one selection at a time.     tree = new JTree(top);     tree.getSelectionModel().setSelectionMode(         TreeSelectionModel.SINGLE_TREE_SELECTION);     // Enable tool tips.     ToolTipManager.sharedInstance().registerComponent(tree);     // Set the icon for leaf nodes.     ImageIcon tutorialIcon = createImageIcon("images/middle.gif");     if (tutorialIcon != null) {       tree.setCellRenderer(new MyRenderer(tutorialIcon));     } else {       System.err.println("Tutorial icon missing; using default.");     }     // Listen for when the selection changes.     tree.addTreeSelectionListener(this);     // Create the scroll pane and add the tree to it.     JScrollPane treeView = new JScrollPane(tree);     // Create the HTML viewing pane.     htmlPane = new JEditorPane();     htmlPane.setEditable(false);     initHelp();     JScrollPane htmlView = new JScrollPane(htmlPane);     // Add the scroll panes to a split pane.     JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);     splitPane.setTopComponent(treeView);     splitPane.setBottomComponent(htmlView);     Dimension minimumSize = new Dimension(100, 50);     htmlView.setMinimumSize(minimumSize);     treeView.setMinimumSize(minimumSize);     splitPane.setDividerLocation(100); // XXX: ignored in some releases     // of Swing. bug 4101306     // workaround for bug 4101306:     // treeView.setPreferredSize(new Dimension(100, 100));     splitPane.setPreferredSize(new Dimension(500, 300));     // Add the split pane to this panel.     add(splitPane);   }   /** Required by TreeSelectionListener interface. */   public void valueChanged(TreeSelectionEvent e) {     DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree         .getLastSelectedPathComponent();     if (node == null)       return;     Object nodeInfo = node.getUserObject();     if (node.isLeaf()) {       BookInfo book = (BookInfo) nodeInfo;       displayURL(book.bookURL);       if (DEBUG) {         System.out.print(book.bookURL + ":  \n    ");       }     } else {       displayURL(helpURL);     }     if (DEBUG) {       System.out.println(nodeInfo.toString());     }   }   private class BookInfo {     public String bookName;     public URL bookURL;     public BookInfo(String book, String filename) {       bookName = book;       bookURL = TreeIconDemo2.class.getResource(filename);       if (bookURL == null) {         System.err.println("Couldn't find file: " + filename);       }     }     public String toString() {       return bookName;     }   }   private void initHelp() {     String s = "TreeDemoHelp.html";     helpURL = TreeIconDemo2.class.getResource(s);     if (helpURL == null) {       System.err.println("Couldn't open help file: " + s);     } else if (DEBUG) {       System.out.println("Help URL is " + helpURL);     }     displayURL(helpURL);   }   private void displayURL(URL url) {     try {       if (url != null) {         htmlPane.setPage(url);       } else { // null url         htmlPane.setText("File Not Found");         if (DEBUG) {           System.out.println("Attempted to display a null URL.");         }       }     } catch (IOException e) {       System.err.println("Attempted to read a bad URL: " + url);     }   }   private void createNodes(DefaultMutableTreeNode top) {     DefaultMutableTreeNode category = null;     DefaultMutableTreeNode book = null;     category = new DefaultMutableTreeNode("Books for Java Programmers");     top.add(category);     // original Tutorial     book = new DefaultMutableTreeNode(new BookInfo(         "The Java Tutorial: A Short Course on the Basics", "tutorial.html"));     category.add(book);     // Tutorial Continued     book = new DefaultMutableTreeNode(         new BookInfo("The Java Tutorial Continued: The Rest of the JDK",             "tutorialcont.html"));     category.add(book);     // JFC Swing Tutorial     book = new DefaultMutableTreeNode(new BookInfo(         "The JFC Swing Tutorial: A Guide to Constructing GUIs",         "swingtutorial.html"));     category.add(book);     // Bloch     book = new DefaultMutableTreeNode(new BookInfo(         "Effective Java Programming Language Guide", "bloch.html"));     category.add(book);     // Arnold/Gosling     book = new DefaultMutableTreeNode(new BookInfo(         "The Java Programming Language", "arnold.html"));     category.add(book);     // Chan     book = new DefaultMutableTreeNode(new BookInfo(         "The Java Developers Almanac", "chan.html"));     category.add(book);     category = new DefaultMutableTreeNode("Books for Java Implementers");     top.add(category);     // VM     book = new DefaultMutableTreeNode(new BookInfo(         "The Java Virtual Machine Specification", "vm.html"));     category.add(book);     // Language Spec     book = new DefaultMutableTreeNode(new BookInfo(         "The Java Language Specification", "jls.html"));     category.add(book);   }   /** Returns an ImageIcon, or null if the path was invalid. */   protected static ImageIcon createImageIcon(String path) {     java.net.URL imgURL = TreeIconDemo2.class.getResource(path);     if (imgURL != null) {       return new ImageIcon(imgURL);     } else {       System.err.println("Couldn't find file: " + path);       return null;     }   }   /**    * Create the GUI and show it. For thread safety, this method should be    * invoked from the event-dispatching thread.    */   private static void createAndShowGUI() {     // Create and set up the window.     JFrame frame = new JFrame("TreeIconDemo2");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     // Create and set up the content pane.     TreeIconDemo2 newContentPane = new TreeIconDemo2();     newContentPane.setOpaque(true); // content panes must be opaque     frame.setContentPane(newContentPane);     // Display the window.     frame.pack();     frame.setVisible(true);   }   public static void main(String[] args) {     // Schedule a job for the event-dispatching thread:     // creating and showing this application's GUI.     javax.swing.SwingUtilities.invokeLater(new Runnable() {       public void run() {         createAndShowGUI();       }     });   }   private class MyRenderer extends DefaultTreeCellRenderer {     Icon tutorialIcon;     public MyRenderer(Icon icon) {       tutorialIcon = icon;     }     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 (leaf && isTutorialBook(value)) {         setIcon(tutorialIcon);         setToolTipText("This book is in the Tutorial series.");       } else {         setToolTipText(null); // no tool tip       }       return this;     }     protected boolean isTutorialBook(Object value) {       DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;       BookInfo nodeInfo = (BookInfo) (node.getUserObject());       String title = nodeInfo.bookName;       if (title.indexOf("Tutorial") >= 0) {         return true;       }       return false;     }   } }