请问JTree中的结点能不能是一些具体的Swing组件(比如JCheckBox)??
也就是说在显示界面的时候各个结点是自定义的Swing组件,用户可以根据Swing组件进行除JTree之外的操作。
请帮忙给出个例子。。

解决方案 »

  1.   

    可以,jtree的每个节点都有自己的绘制器和编辑器,编辑器可以作出你想要得节点
      

  2.   

    /*
     * FileViewer.java
     *
     * Created on 2005年5月8日, 上午10:46
     */package test.tree;
    import java.io.File;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;/**
     *
     * @author yanl
     */
    public class FileViewer extends JFrame{
        private static String metalClassName = "lambert.swing.plaf.jupiter.JupiterLookAndFeel";
        /** Creates a new instance of FileViewer */
        public FileViewer() {
    //        try {
    //            UIManager.setLookAndFeel(metalClassName);
    //            SwingUtilities.updateComponentTreeUI(this);
    //            pack();
    //        } catch (UnsupportedLookAndFeelException exc) {
    //            System.out.println("UnsupportedLookAndFeelException Error:" + exc);
    //        } catch (IllegalAccessException exc) {
    //            System.out.println("IllegalAccessException Error:" + exc);
    //        } catch (ClassNotFoundException exc) {
    //            System.out.println("ClassNotFoundException Error:" + exc);
    //        } catch (InstantiationException exc) {
    //            System.out.println("InstantiateException Error:" + exc);
    //        }
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            final JTree tree = new JTree(createTreeModel());
            JScrollPane scrollPane = new JScrollPane(tree);
            
            FileNodeRenderer renderer = new FileNodeRenderer();
            tree.setEditable(true);
            tree.setCellRenderer(renderer);
            
            getContentPane().add(scrollPane);
            
            tree.addTreeExpansionListener(new TreeExpansionListener(){
                public void treeCollapsed(TreeExpansionEvent e){
                }
                public void treeExpanded(TreeExpansionEvent e){
                    TreePath path = e.getPath();
                    FileNode node = (FileNode)path.getLastPathComponent();
                    if(!node.isExplored()){
                        DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
                        node.explore();
                        model.nodeStructureChanged(node);
                    }
                }
            });
            
            tree.addTreeSelectionListener(new TreeSelectionListener(){
                public void valueChanged(TreeSelectionEvent e){
                    TreePath path = e.getNewLeadSelectionPath();
                    FileNode node = (FileNode)path.getLastPathComponent();
                    node.setSelected();
                    if(path != null)
                        System.out.println(path);
                }
            });
        }
        
        private DefaultTreeModel createTreeModel(){
            File root = new File("E:/");
            FileNode rootNode = new FileNode(root);
            rootNode.explore();
            return new DefaultTreeModel(rootNode);
        }
        
        public static void main(String [] args){
            FileViewer f = new FileViewer();
            f.setSize(300,300);
            f.show();
        }
    }class FileNode extends DefaultMutableTreeNode{
        private boolean explored = false;
        private boolean selected = false;
        public FileNode(File file){
            setUserObject(file);
        }
        public boolean getAllowsChildren() {return isDirectory();}
        public boolean isLeaf() {return !isDirectory();}
        public File getFile(){return (File)getUserObject();}
        public boolean isExplored(){return explored;}
        public boolean isDirectory(){
            File file = getFile();
            return file.isDirectory();
        }
        public boolean isSelected(){
            return selected;
        }
        public void setSelected(){
            selected = !selected;
        }
        public String toString(){
            File file = (File)getUserObject();
            String filename = file.toString();
            int index = filename.lastIndexOf("\\");
            return (index!=-1&&index!=filename.length()-1)?
                filename.substring(index+1):filename;
        }
        public void explore(){
            if(!isExplored()){
                File file = getFile();
                File [] children = file.listFiles();
                for(int i = 0;i<children.length;++i){
                    add(new FileNode(children[i]));
                }
                explored = true;
            }
        }
    }class FileNodeRenderer extends DefaultTreeCellRenderer{
        protected JCheckBox checkBox = new JCheckBox("Backup");
        private Component strut = Box.createHorizontalStrut(5);
        private JPanel panel = new JPanel();
        
        public FileNodeRenderer(){
            panel.setBackground(UIManager.getColor("Tree.textBackground"));
            setOpaque(false);
            checkBox.setOpaque(false);
            panel.setOpaque(false);
            panel.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));
            panel.add(this);
            panel.add(strut);
            panel.add(checkBox);
        }
        
        public Component getTreeCellRendererComponent(
                JTree tree,Object value,boolean selected,
                boolean expanded,boolean leaf,int row,
                boolean hasFocus){
            FileNode node = (FileNode)value;
            super.getTreeCellRendererComponent(tree, value,selected,expanded,leaf,row, hasFocus);
            checkBox.setVisible(node.isDirectory());
            checkBox.setSelected(node.isSelected());
            return panel;
        }
    }
      

  3.   

    这位同学,你的问题,可有在这个网站看到所有的情况,还有例子:
    http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/
    记得给我加分:
    我也是小兵