import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.tree.TreeSelectionModel; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.ImageIcon; import java.net.URL; import java.io.IOException; import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; public class TreeIconDemo extends JSplitPane { private JEditorPane htmlPane; private static boolean DEBUG = false; private URL helpURL; public TreeIconDemo() { super(VERTICAL_SPLIT); //Create the nodes. DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java Series"); createNodes(top); //Create a tree that allows one selection at a time. JTree tree = new JTree(top); tree.getSelectionModel().setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION); /* * Set the icon for leaf nodes. * Note: In the Swing 1.0.x release, we used * swing.plaf.basic.BasicTreeCellRenderer. */ DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); renderer.setLeafIcon(new ImageIcon("images/middle.gif")); tree.setCellRenderer(renderer); //Listen for when the selection changes. tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) (e.getPath().getLastPathComponent()); 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()); } } }); //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 this panel. add(treeView); add(htmlView); Dimension minimumSize = new Dimension(100, 50); htmlView.setMinimumSize(minimumSize); treeView.setMinimumSize(minimumSize); //setDividerLocation(100); //XXX: ignored! bug 4101306 //workaround for bug 4101306: treeView.setPreferredSize(new Dimension(100, 100)); setPreferredSize(new Dimension(500, 300)); } private class BookInfo { public String bookName; public URL bookURL; public String prefix = "file:" + System.getProperty("user.dir") + System.getProperty("file.separator"); public BookInfo(String book, String filename) { bookName = book; try { bookURL = new URL(prefix + filename); } catch (java.net.MalformedURLException exc) { System.err.println("Attempted to create a BookInfo " + "with a bad URL: " + bookURL); bookURL = null; } } public String toString() { return bookName; } } private void initHelp() { String s = null; try { s = "file:" + System.getProperty("user.dir") + System.getProperty("file.separator") + "TreeDemoHelp.html"; if (DEBUG) { System.out.println("Help URL is " + s); } helpURL = new URL(s); displayURL(helpURL); } catch (Exception e) { System.err.println("Couldn't create help URL: " + s); } } private void displayURL(URL url) { try { htmlPane.setPage(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); //Tutorial book = new DefaultMutableTreeNode(new BookInfo ("The Java Tutorial: Object-Oriented Programming for the Internet", "tutorial.html")); category.add(book); //Arnold/Gosling book = new DefaultMutableTreeNode(new BookInfo ("The Java Programming Language", "arnold.html")); category.add(book); //FAQ book = new DefaultMutableTreeNode(new BookInfo( "The Java FAQ", "faq.html")); category.add(book); //Chan/Lee book = new DefaultMutableTreeNode(new BookInfo ("The Java Class Libraries: An Annotated Reference", "chanlee.html")); category.add(book); //Threads book = new DefaultMutableTreeNode(new BookInfo ("Concurrent Programming in Java: Design Principles and Patterns", "thread.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); } public static void main(String[] args) { /* * Create a window. Use JFrame since this window will include * lightweight components. */ JFrame frame = new JFrame("TreeIconDemo"); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }; frame.addWindowListener(l); frame.getContentPane().add("Center", new TreeIconDemo()); frame.pack(); frame.show(); } }