Jtree (节点的渲染+资源管理器)

image

我们的还是自定义的Jtree的类:

package jtree.customNode;



import java.io.File;



import javax.swing.JTree;

import javax.swing.tree.DefaultTreeModel;



import util.ImageManager;

import jtree.checkBoxTree.CheckBoxTreeNodeListender;



public class ZTreeCusNode extends JTree {



    private static final long serialVersionUID = -581164150235777786L;

    private static final String ROOT_NAME = "我的电脑";

    private static final int levelUp = 3;

    

     public ZTreeCusNode() {

        this.setModel(new DefaultTreeModel(createRootNode()));

        this.setCellRenderer(new CusNodeTreeCellRender());

        this.addCheckSelectListender();

    }



     private void addCheckSelectListender() {

         this.addMouseListener(new CheckBoxTreeNodeListender(this));

    }



    public  CusTreeNode createRootNode(){ 

        CusTreeNode treeNode = null;

        CusTreeNode rootNode = new CusTreeNode(ROOT_NAME,ImageManager.getImageIconByShortName("home.png")); 

          for(int i = 0; i < File.listRoots().length ; i++){ 

              if(File.listRoots()[i].isDirectory()){ 

                  String rootPath = File.listRoots()[i].getPath(); 

                  treeNode  = creatDefaultMutableTreeNode(rootPath,0); 

                  rootNode.add(treeNode); 

                  treeNode = null;

              } 

          } 



            return rootNode; 

        }



    private CusTreeNode creatDefaultMutableTreeNode(String nodePath,int level) {

        CusTreeNode node = null;

        if(level == 0){

            node = new CusTreeNode(nodePath,ImageManager.getImageIconByShortName("pan.png"));

        }else if(level == 1){

            node = new CusTreeNode(nodePath,ImageManager.getImageIconByShortName("ff.png"));

        }else{

            node = new CusTreeNode(nodePath);

        }

        CusTreeNode treeNode = null;

        level = level+1;

        File file = new File(nodePath);

        if(file.isDirectory() && file.listFiles() != null){

             for(int i = 0; i < file.listFiles().length && level < levelUp; i++){ 

                  if(file.listFiles()[i].isDirectory()){ 

                      String rootPath = file.listFiles()[i].getPath();

                      treeNode  = creatDefaultMutableTreeNode(rootPath,level); 

                      node.add(treeNode); 

                      treeNode = null; 

                  } 

              }

        }

         

        return node;

    }

}

但是因为各个节点的图标,可能比一样,我们把图标的信息集合到节点中去,这样的话,可以根据条件给不同的节点设置不同的节点,显示的时候,直接从节点中取出来即可,根据这种分析,我们需要自定义DefaultMutableTreeNode 。

package jtree.customNode;



import javax.swing.Icon;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.TreeSelectionModel;



public class CusTreeNode extends DefaultMutableTreeNode {



    private static final long serialVersionUID = 3311434895405929201L;



    private boolean isSelected = false;



    private boolean enabled = false;



    private boolean isVisible = false;



    private Icon icon = null;



    private String iconName = null;

    

    private int selectionMode = 0;



    public CusTreeNode(Object userObject,Icon icon) {

        this(userObject, true, false, true, true, icon);

    }



    public CusTreeNode(String nodePath) {

        this(nodePath, true, false, true, true, null);

    }



    public CusTreeNode(Object userObject, boolean allowsChildren,



            boolean isSelected, boolean enabled, boolean isVisible, Icon icon) {



            super(userObject, allowsChildren);



            this.isSelected = isSelected;



            this.enabled = enabled;



            this.isVisible = isVisible;



            this.icon = icon;



            setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);



        }



    

    public boolean isSelected() {

        return isSelected;

    }



    public void setSelected(boolean isSelected) {

        this.isSelected = isSelected;

    }



    public boolean isEnabled() {

        return enabled;

    }



    public void setEnabled(boolean enabled) {

        this.enabled = enabled;

    }



    public boolean isVisible() {

        return isVisible;

    }



    public void setVisible(boolean isVisible) {

        this.isVisible = isVisible;

    }



    public Icon getIcon() {

        return icon;

    }



    public void setIcon(Icon icon) {

        this.icon = icon;

    }



    public String getIconName() {

        return iconName;

    }



    public void setIconName(String iconName) {

        this.iconName = iconName;

    }



    public int getSelectionMode() {

        return selectionMode;

    }



    public void setSelectionMode(int selectionMode) {

        this.selectionMode = selectionMode;

    }



    

}

 

然后是节点的渲染如下:

package jtree.customNode;



import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Dimension;



import javax.swing.Icon;

import javax.swing.JPanel;

import javax.swing.JTree;

import javax.swing.UIManager;

import javax.swing.plaf.ColorUIResource;

import javax.swing.tree.TreeCellRenderer;



import jtree.checkBoxTree.CheckBoxTreeLabel;



public class CusNodeTreeCellRender extends JPanel implements TreeCellRenderer {



    private static final long serialVersionUID = 4676667399191240255L;



    protected CheckBoxTreeLabel label;



    // protected JLabel label;

    public CusNodeTreeCellRender() {

        setLayout(new BorderLayout());

        add(label = new CheckBoxTreeLabel());

        // add(label = new JLabel());

        label.setForeground(UIManager.getColor("Tree.textForeground"));

        this.setPreferredSize(new Dimension(100, 20));

    }



    /*

     * (non-Javadoc)

     * 

     * @see

     * javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.

     * swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)

     */

    @Override

    public Component getTreeCellRendererComponent(JTree tree, Object value,

            boolean selected, boolean expanded, boolean leaf, int row,

            boolean hasFocus) {

        String stringValue = tree.convertValueToText(value, selected, expanded,

                leaf, row, hasFocus);

        boolean nodeIsEnabled = ((CusTreeNode) value).isEnabled();

        setEnabled(nodeIsEnabled);

       

        label.setFont(tree.getFont());

        label.setText(stringValue);

        label.setSelected(selected);

        label.setFocus(hasFocus);

        if (leaf)

            label.setIcon(UIManager.getIcon("Tree.leafIcon"));

        else if (expanded)

            label.setIcon(UIManager.getIcon("Tree.openIcon"));

        else{

             label.setIcon(UIManager.getIcon("Tree.closedIcon"));

        }

        Icon icon = ((CusTreeNode) value).getIcon();

        if(icon != null){

             label.setIcon(icon);

        }



        return this;

    }



    @Override

    public void setBackground(Color color) {

        if (color instanceof ColorUIResource)

            color = null;

        super.setBackground(color);

    }

}

测试代码:

public class TestZTreeCusNode {



    /**

     * @param args

     */

    public static void main(String[] args) {

        ZTreeCusNode tree = new ZTreeCusNode();

        JScrollPane scroll = new JScrollPane(tree);

        //测试的环境

        JFrame test = new JFrame();

        test.setSize(450, 330);

        test.setLocation((test.getToolkit().getScreenSize().width - 450) / 2,

                (test.getToolkit().getScreenSize().height - 330) / 2);

        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        test.add(scroll);

        test.setVisible(true);





    }



}

你可能感兴趣的:(JTree)