www.pudn.com > srmail.rar > TreeDemo.java


/** 
 * 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 javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.UIManager; 
 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreeSelectionModel; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
 
import java.net.URL; 
import java.io.IOException; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
 
public class TreeDemo extends JPanel 
                      implements TreeSelectionListener { 
    private JEditorPane htmlPane; 
    private JTree tree; 
    private URL helpURL; 
    private static boolean DEBUG = false; 
 
    //Optionally play with line styles.  Possible values are 
    //"Angled" (the default), "Horizontal", and "None". 
    private static boolean playWithLineStyle = false; 
    private static String lineStyle = "Horizontal"; 
     
    //Optionally set the look and feel. 
    private static boolean useSystemLookAndFeel = false; 
 
    public TreeDemo() { 
        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); 
 
        //Listen for when the selection changes. 
        tree.addTreeSelectionListener(this); 
 
        if (playWithLineStyle) { 
            System.out.println("line style = " + lineStyle); 
            tree.putClientProperty("JTree.lineStyle", lineStyle); 
        } 
 
        //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 = TreeDemo.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 = TreeDemo.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); 
    } 
         
    /** 
     * Create the GUI and show it.  For thread safety, 
     * this method should be invoked from the 
     * event-dispatching thread. 
     */ 
    private static void createAndShowGUI() { 
        if (useSystemLookAndFeel) { 
            try { 
                UIManager.setLookAndFeel( 
                    UIManager.getSystemLookAndFeelClassName()); 
            } catch (Exception e) { 
                System.err.println("Couldn't use system look and feel."); 
            } 
        } 
 
        //Make sure we have nice window decorations. 
        JFrame.setDefaultLookAndFeelDecorated(true); 
 
        //Create and set up the window. 
        JFrame frame = new JFrame("TreeDemo"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
        //Create and set up the content pane. 
        TreeDemo newContentPane = new TreeDemo(); 
        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(); 
            } 
        }); 
    } 
}