renderer.setLeafIcon(new ImageIcon("a.jpg"));  
renderer.setClosedIcon(new ImageIcon("b.jpg"));
renderer.setOpenIcon(new ImageIcon("c.jpg"));
这样设置图标都变来变去的 我想增加一个节点 图标固定的 怎么弄呢 

解决方案 »

  1.   

    继承 DefaultMutableTreeNode 封装一个接点对象,把每个接点要使用的图标封装在这个对象里,然后JTree
    实现 TreeCellRenderer 接口,重写getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) 方法,在这个方法中,把Object value 转换成你自己封装的对象,从中就可以获得 这个接点要使用的图标,setIcon(icon);如果实现还有问题,晚上发完整代码!
      

  2.   

    hengxxh谢谢你的回答 我还是有点不懂 你还是发个代码吧~~~
      

  3.   

    下面是我写的代码:
    你把代码复制下来你还要做的事 【1】默认的包名是 demo,你可以更改,【2】 在d盘的根目录下放入几个图标,默认的图标的名字是test1~test8 格式是png,你也可以改为其他格式,【3】运行,里面包含main(),可以直接运行,
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package demo;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;/**
     *
     * @author Administrator
     */
    public class TestJTreeIcon extends JFrame {    private javax.swing.JTree jTree1;
        private DefaultMutableTreeNode root;
        private DefaultMutableTreeNode test1Node;
        private DefaultMutableTreeNode test2Node;
        private DefaultMutableTreeNode test3Node;
        private DefaultMutableTreeNode test4Node;
        private DefaultMutableTreeNode test5Node;
        private DefaultMutableTreeNode test6Node;
        private DefaultMutableTreeNode test7Node;    public TestJTreeIcon() {
            jTree1 = new JTree();
            JTreeBean root_bean = new JTreeBean("test8", new ImageIcon("d:/test8.png"), Color.BLACK);
            JTreeBean test1 = new JTreeBean("test1", new ImageIcon("d:/test1.png"), Color.BLACK);
            JTreeBean test2 = new JTreeBean("test2", new ImageIcon("d:/test2.png"), Color.BLACK);
            JTreeBean test3 = new JTreeBean("test3", new ImageIcon("d:/test3.png"), Color.BLACK);
            JTreeBean test4 = new JTreeBean("test4", new ImageIcon("d:/test4.png"), Color.BLACK);
            JTreeBean test5 = new JTreeBean("test5", new ImageIcon("d:/test5.png"), Color.BLACK);
            JTreeBean test6 = new JTreeBean("test6", new ImageIcon("d:/test6.png"), Color.BLACK);
            JTreeBean test7 = new JTreeBean("test7", new ImageIcon("d:/test7.png"), Color.BLACK);
           
            root = new DefaultMutableTreeNode(root_bean);
            test1Node = new DefaultMutableTreeNode(test1);
            test2Node = new DefaultMutableTreeNode(test2);
            test3Node = new DefaultMutableTreeNode(test3);
            test4Node = new DefaultMutableTreeNode(test4);
            test5Node = new DefaultMutableTreeNode(test5);
            test6Node = new DefaultMutableTreeNode(test6);
            test7Node = new DefaultMutableTreeNode(test7);
            
            root.add(test1Node);
            test1Node.add(test2Node);
            test2Node.add(test3Node);
            test3Node.add(test4Node);
            test4Node.add(test5Node);
            test5Node.add(test6Node);
            root.add(test7Node);
            
             DefaultTreeModel model = new DefaultTreeModel(root,true);
            jTree1.setModel(model);
             jTree1.setCellRenderer(new JTreeCellRenderer());
             
            this.setSize(500, 500);
            this.setLayout(new BorderLayout());
            this.add(jTree1,BorderLayout.CENTER);
        }
        
        public static void main(String args[]){
          new TestJTreeIcon().setVisible(true);
        }
    }class JTreeBean {    private String strNode;
        private ImageIcon iconNode;
        private Color strColor;
        private JComponent jcp = null;    public JTreeBean(String str, ImageIcon icon, Color color) {
            strNode = str;
            iconNode = icon;
            strColor = color;
        }    public JTreeBean(String str, ImageIcon icon) {
            strNode = str;
            iconNode = icon;
        }    public JTreeBean(String str) {
            strNode = str;
        }    public String getString() {
            return strNode;
        }    public void setString(String strNode) {
            this.strNode = strNode;
        }    public void setJComponent(JComponent jcp) {
            this.jcp = jcp;
        }    public ImageIcon getIcon() {
            return iconNode;
        }    public void setIcon(ImageIcon iconNode) {
            this.iconNode = iconNode;
        }    public Color getColor() {
            return strColor;
        }    public void setColor(Color strColor) {
            this.strColor = strColor;
        }
    }class JTreeCellRenderer extends DefaultTreeCellRenderer {    public JTreeCellRenderer() {
        }    @Override
        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);        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
            if (node.getUserObject() instanceof JTreeBean) {
            } else {
                System.out.println(node.getUserObject());
            }
            JTreeBean jtb = (JTreeBean) node.getUserObject();
            setIcon(jtb.getIcon());
            setText(jtb.getString());
            setTextNonSelectionColor(jtb.getColor());
            //    setForeground(Color.RED);  
            // setTextSelectionColor(Color.BLUE);
            //  setBackgroundSelectionColor(Color.GREEN);
            //  setBackgroundNonSelectionColor(Color.BLUE);
            return this;
        }    protected boolean isTutorialBook(Object value) {
            DefaultMutableTreeNode node =
                    (DefaultMutableTreeNode) value;        return false;
        }

      

  4.   

    怎么添加啊
    import java.awt.*;
    import java.awt.event.*;
    import java.text.SimpleDateFormat;
    import javax.swing.*;
    import java.util.*;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.plaf.ColorUIResource;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;public class MainForm extends JFrame implements ActionListener {    JScrollPane scrollpane, scrollpane2;
        JTextField tf, tf1;
        JLabel l;
        JButton btnadd, btnEdit, btnDel, btnw, btnr, empty;
        MenuItem open, save, exit, about;
        MenuBar mb;
        CheckboxMenuItem file, folder;
        DefaultMutableTreeNode root;
        JTree jTree;
        DefaultMutableTreeNode currTreeNode = null;
        JTextArea ta;
        Box box, box2, box3, box6;
        JPanel panel;
        JProgressBar pb;
        JRadioButton rb1,rb2;
        Date currentTime;SimpleDateFormat formatter;
        String str;
        JTable table,table1;
        Vector  dataVector,headVector,rowVector;
            private DefaultMutableTreeNode test1Node; 
        private DefaultMutableTreeNode test2Node; 
        public MainForm() {        super("文件模拟管理系统");
            Container cn = getContentPane();
            cn.setLayout(new BorderLayout(3, 3));
            Font font = new Font("TimesRoman", Font.BOLD, 16);
                    //时间设置
        currentTime = new Date();
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        str = formatter.format(currentTime);
            
            //设置菜单
            mb = new MenuBar();
            Menu m1 = new Menu("文件");
            Menu m2 = new Menu("编辑");
            Menu m3 = new Menu("帮助");
            Menu new0 = new Menu("新建");
            mb.add(m1);
            mb.add(m2);
            mb.add(m3);
            file = new CheckboxMenuItem("文件");
            folder = new CheckboxMenuItem("文件夹");
            open = new MenuItem("打开");
            save = new MenuItem("保存");
            exit = new MenuItem("退出");
            exit.addActionListener(this);
            about = new MenuItem("关于");
            m1.add(new0);
            new0.add(file);
            new0.add(folder);
            m1.add(open);
            m1.add(save);
            m1.add(exit);
            m3.add(about);
            setMenuBar(mb);        jTree = new JTree()  ; 
     JTreeBean root_bean = new JTreeBean("test8", new ImageIcon("d:/test8.png"),Color.BLACK);  
     root = new DefaultMutableTreeNode(root_bean); 
            DefaultTreeModel mode = new DefaultTreeModel(root,true); 
            jTree.setModel(mode); 
            jTree.setCellRenderer(new JTreeCellRenderer()); 
            scrollpane = new JScrollPane(jTree);
             
            
            l = new JLabel("     路径     ");
            tf = new JTextField();
            Box box1 = Box.createHorizontalBox();
            box1.add(l);
            box1.add(tf);
            //在表格上显式文件或文件夹详细信息
            JPanel panel1 = new JPanel();
            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel();
            JLabel l1 = new JLabel("文件名:");
            tf1 = new JTextField(10);
            ButtonGroup bg = new ButtonGroup();
            rb1 = new JRadioButton("文件", true);
            rb2 = new JRadioButton("文件夹");
            bg.add(rb2);
            bg.add(rb1);
            JLabel l2 = new JLabel("文件类型: ");
            JLabel l3 = new JLabel("访问权限: ");
            JCheckBox cb1 = new JCheckBox("可读", true);
            JCheckBox cb2 = new JCheckBox("可写", true);
            cb1.setEnabled(false);
            JLabel l4 = new JLabel("日期:  ");
            JTextField tf2 = new JTextField(12);
            tf2.setText(str);
            tf2.setForeground(Color.RED);
            tf2.setEnabled(false);
            btnadd = new JButton("新建");
            btnEdit = new JButton("重命名");
            btnDel = new JButton("删除");
            btnw = new JButton("写文件");
            btnr = new JButton("打开");
            btnr.addActionListener(this);
            btnadd.setBackground(Color.GRAY);
            btnEdit.setBackground(Color.GRAY);
            btnDel.setBackground(Color.GRAY);
            btnw.setBackground(Color.GRAY);
            btnr.setBackground(Color.GRAY);        btnadd.addActionListener(new AddItem());
            btnDel.addActionListener(new DelItem());
            btnEdit.addActionListener(new EditItem());
            panel1.add(l1);
            panel1.add(tf1);
            panel1.add(l2);
            panel1.add(rb1);
            panel1.add(rb2);
            panel2.add(l3);
            panel2.add(cb1);
            panel2.add(cb2);
            panel2.add(l4);
            panel2.add(tf2);
            panel3.add(btnadd);
            panel3.add(btnEdit);
            panel3.add(btnDel);
            panel3.add(btnw);
            panel3.add(btnr);
            Box box0 = Box.createVerticalBox();
            Box box4 = Box.createHorizontalBox();
            Box box5 = Box.createVerticalBox();
           
            String[] headers = { "文件名", "大小", "类型","时间" };
            Object[][] cellData = null; 
            DefaultTableModel model = new DefaultTableModel(cellData, headers) { 
            public boolean isCellEditable(int row, int column) {
                return false;
              }
            };         table = new JTable(model);   
            table.setPreferredScrollableViewportSize(new Dimension(100, 80));
            JScrollPane scrollpane1 = new JScrollPane(table);
            box4.add(scrollpane1);
            box5.add(panel1);
            box5.add(panel2);
            box5.add(panel3);
            box4.setBorder(BorderFactory.createLineBorder(Color.PINK));
            box0.add(box4);
            box0.add(box5);        box = Box.createVerticalBox();
            box2 = Box.createHorizontalBox();
            box3 = Box.createHorizontalBox();
            box6 = Box.createHorizontalBox();
            
            String[] head = { "文件名", "大小", "类型","时间" };
            Object[][] cell = null; 
            DefaultTableModel model1 = new DefaultTableModel(cell, head) { 
            public boolean isCellEditable(int row, int column) {
                return false;
              }
            }; 
            table1 = new JTable(model1);   
            table1.setPreferredScrollableViewportSize(new Dimension(100, 80));
            scrollpane2 = new JScrollPane(table1);
            box2.add(scrollpane2);
            panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
            JPanel pan = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
            JLabel label1 = new JLabel("已使用0k");
            pb = new JProgressBar();
            UIManager.put("ToolTip.foreground", new ColorUIResource(Color.BLACK));
            UIManager.put("ToolTip.background", new ColorUIResource(Color.RED));
            pb.setToolTipText("存储空间使用情况");
            empty = new JButton("清空回收站");
            empty.setBackground(Color.white);
            empty.setForeground(Color.darkGray);
            empty.setBorder(BorderFactory.createLineBorder(Color.PINK));
            panel.add(empty);
            box3.add(panel);
            pan.add(pb);
            pan.add(label1);
            box6.add(pan);
            pb.setPreferredSize(new Dimension(200, 50));
            box.add(box2);
            box.add(box3);
            box.add(box6);   
      

  5.   

    //设置所有组件文本的字体
            tf.setFont(font);
            tf2.setFont(font);
            l.setFont(font);
            btnadd.setFont(font);
            btnDel.setFont(font);
            btnw.setFont(font);
            btnr.setFont(font);
            empty.setFont(font);
            l1.setFont(font);
            l2.setFont(font);
            l3.setFont(font);
            l4.setFont(font);
            rb1.setFont(font);
            rb2.setFont(font);
            cb1.setFont(font);
            cb2.setFont(font);        add(box1, BorderLayout.NORTH);
            add(scrollpane, BorderLayout.WEST);
            add(box0, BorderLayout.CENTER);
            add(box, BorderLayout.EAST);
           
            //设置窗体显式位置和大小
            setSize(950, 650);
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Dimension frameSize = this.getSize();
            if (frameSize.height > screenSize.height) {
                frameSize.height = screenSize.height;
            }
            if (frameSize.width > screenSize.width) {
                frameSize.width = screenSize.width;
            }
         
            
            setLocation(screenSize.width / 2 - frameSize.width / 2, screenSize.height / 2 - frameSize.height / 2);
            setResizable(false);
            cn.setBackground(Color.ORANGE);
            setUndecorated(true);   
            this.getRootPane().setWindowDecorationStyle(JRootPane.WARNING_DIALOG);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }    
        class ProgressBar implements Runnable {        public void run() {
                for (int i = 0; i <= 200; i++) {
                    pb.setValue(i);
                    pb.setBackground(Color.BLACK);
                    pb.setForeground(Color.RED);
                    pb.setStringPainted(true);
                    try {
                        Thread.sleep(50);
                    } catch (Exception ee) {
                        ee.printStackTrace();
                    }
                    if (pb.getPercentComplete() == 1.0) {                }
                }
            }
        }    //增加新节点事件监听
        class AddItem implements ActionListener {        public void actionPerformed(ActionEvent e) {
                //执行增加节点的动作  
                
            JTreeBean root_bean = new JTreeBean(tf1.getText(), new ImageIcon("d:/test8.png"),Color.BLACK); 
            root = new DefaultMutableTreeNode(root_bean);            
        
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(root_bean) ;        if(rb1.isSelected())
            {
                DefaultTableModel tableModel = (DefaultTableModel) table.getModel();          
                tableModel.addRow(new Object[]{tf1.getText(), "35", "Boss",str});         }
            else if(rb2.isSelected()){       
                
                DefaultTableModel tableModel = (DefaultTableModel) table.getModel();                
                tableModel.addRow(new Object[]{tf1.getText(), "------", "------",str});        }
              
            jTree.setCellRenderer(new JTreeCellRenderer()); 
            currTreeNode.add(newNode);
            DefaultTreeModel mode = new DefaultTreeModel(root,true); 
            jTree.setModel(mode); 
            mode.nodeStructureChanged(currTreeNode);
            Thread t = new Thread(new ProgressBar());
                //t.start();
            }
        }
        //重命名事件监听   
      
        class EditItem implements ActionListener {        public void actionPerformed(ActionEvent e) {
                //执行重命名的动作   
                new NewClass1();            
                currTreeNode.setUserObject("");
                DefaultTreeModel model = (DefaultTreeModel) jTree.getModel();
                model.nodeChanged(currTreeNode);
            }
        }
        //删除节点事件监听    
        class DelItem implements ActionListener {        public void actionPerformed(ActionEvent e) {
                //执行删除节点的动作   
                DefaultTreeModel model = (DefaultTreeModel) jTree.getModel();
                model.removeNodeFromParent(currTreeNode);
            }
        }    class SelItem implements TreeSelectionListener {
            public void valueChanged(TreeSelectionEvent e) {
               
                currTreeNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
                TreeNode tr[] = currTreeNode.getPath();
                if (currTreeNode.getLevel()==0)return;
                String fileName = tr.length>2 ? tr[1].toString()+tr[2].toString() : tr[1].toString();
                for (int i=2;i<tr.length;i++){
                fileName +="\\"+tr[i].toString();
               
              }
                 tf.setText(fileName);        }
        }
        public static void main(String[] args) {   
           new MainForm();          
        }    public void actionPerformed(ActionEvent e) {
            if (e.getSource() == exit) {
                System.exit(0);
            }
             if (e.getSource() == btnr) {
            }
        }      
    }
    class JTreeBean {     private String strNode; 
        private ImageIcon iconNode; 
        private Color strColor; 
        private JComponent jcp = null;     public JTreeBean(String str, ImageIcon icon, Color color) { 
            strNode = str; 
            iconNode = icon; 
            strColor = color; 
        }     public JTreeBean(String str, ImageIcon icon) { 
            strNode = str; 
            iconNode = icon; 
        }     public JTreeBean(String str) { 
            strNode = str; 
        }     public String getString() { 
            return strNode; 
        }     public void setString(String strNode) { 
            this.strNode = strNode; 
        }     public void setJComponent(JComponent jcp) { 
            this.jcp = jcp; 
        }     public ImageIcon getIcon() { 
            return iconNode; 
        }     public void setIcon(ImageIcon iconNode) { 
            this.iconNode = iconNode; 
        }     public Color getColor() { 
            return strColor; 
        }     public void setColor(Color strColor) { 
            this.strColor = strColor; 
        } 
    } class JTreeCellRenderer extends DefaultTreeCellRenderer {     public JTreeCellRenderer() { 
        } 
        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);              
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
            if (node.getUserObject() instanceof JTreeBean) { 
                
            } else { 
                System.out.println(node.getUserObject()); 
            } 
            JTreeBean jtb = (JTreeBean) node.getUserObject(); 
            setIcon(jtb.getIcon()); 
            setText(jtb.getString()); 
            setTextNonSelectionColor(jtb.getColor()); 
            return this; 
        } 

      

  6.   

    class MyTreeNode extends DefaultMutableTreeNode{
        ......    public ImageIcon getImageIcon(){
            return icon;
        }
    }class MyTreeRenderer implements TreeCellRenderer{
        public Component getTreeCellRendererComponent(......){
            ......
            if(value instanceof MyTreeNode){
                ((MyTreeNode)value).setIcon(((MyTreeNode)value).getImageIcon());
            }
            ......
        }
    }......
    tree.addNode(new MyTreeNode(ImageIcon icon));//关键是对象封装,再通过CellRenderer实现
    tree.setCellRenderer(new MyTreeRenderer());