小弟我想将checkbox加载到Jtree中,不知道该怎么实现。小弟在本论坛也找到了一些相关的代码,但是最终还没有实现。希望各位高手赐教!(最好给小弟一段完整的能实现的代码,小弟不胜感激!)

解决方案 »

  1.   

    这里有个例子,参考一下吧
    import javax.swing.*;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.tree.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    import java.util.Vector;public class FileTree3
    extends JFrame
    {
    public static final ImageIcon ICON_COMPUTER =
    new ImageIcon("computer.gif");
    public static final ImageIcon ICON_DISK =
    new ImageIcon("disk.gif");
    public static final ImageIcon ICON_FOLDER =
    new ImageIcon("folder.gif");
    public static final ImageIcon ICON_EXPANDEDFOLDER =
    new ImageIcon("expandedfolder.gif"); protected JTree  m_tree;
    protected DefaultTreeModel m_model;
    protected JTextField m_display; protected JPopupMenu m_popup;
    protected Action m_action;
    protected TreePath m_clickedPath; public FileTree3()
    {
    super("Directories Tree [Tool Tips]");
    setSize(400, 300); DefaultMutableTreeNode top = new DefaultMutableTreeNode(
    new IconData(ICON_COMPUTER, null, "Computer")); DefaultMutableTreeNode node;
    File[] roots = File.listRoots();
    for (int k=0; k<roots.length; k++)
    {
    node = new DefaultMutableTreeNode(new IconData(ICON_DISK,
    null, new FileNode(roots[k])));
    top.add(node);
    node.add(new DefaultMutableTreeNode( new Boolean(true) ));
    } m_model = new DefaultTreeModel(top);
    // NEW
    m_tree = new JTree(m_model)
    {
    public String getToolTipText(MouseEvent ev)
    {
    if(ev == null)
    return null;
    TreePath path = m_tree.getPathForLocation(ev.getX(),
    ev.getY());
    if (path != null)
    {
    FileNode fnode = getFileNode(getTreeNode(path));
    if (fnode==null)
    return null;
    File f = fnode.getFile();
    return (f==null ? null : f.getPath());
    }
    return null;
    }
    };
    ToolTipManager.sharedInstance().registerComponent(m_tree);                m_tree.putClientProperty("JTree.lineStyle", "Angled"); TreeCellRenderer renderer = new
    IconCellRenderer();
    m_tree.setCellRenderer(renderer);
            m_tree.addTreeExpansionListener(new
    DirExpansionListener());
    m_tree.getSelectionModel().setSelectionMode(
    TreeSelectionModel.SINGLE_TREE_SELECTION);
    m_tree.setShowsRootHandles(true);
    m_tree.setEditable(false); JScrollPane s = new JScrollPane();
    s.getViewport().add(m_tree);
    getContentPane().add(s, BorderLayout.CENTER); m_display = new JTextField();
    m_display.setEditable(false);
    getContentPane().add(m_display, BorderLayout.NORTH); m_popup = new JPopupMenu();
    m_action = new AbstractAction()
    {
    public void actionPerformed(ActionEvent e)
    {
    if (m_clickedPath==null)
    return;
    if (m_tree.isExpanded(m_clickedPath))
    m_tree.collapsePath(m_clickedPath);
    else
    m_tree.expandPath(m_clickedPath);
    }
    };
    m_popup.add(m_action);
    m_popup.addSeparator(); Action a1 = new AbstractAction("Delete")
    {
    public void actionPerformed(ActionEvent e)
    {
                                    m_tree.repaint();
    JOptionPane.showMessageDialog(FileTree3.this,
    "Delete option is not implemented",
    "Info", JOptionPane.INFORMATION_MESSAGE);
    }
    };
    m_popup.add(a1); Action a2 = new AbstractAction("Rename")
    {
    public void actionPerformed(ActionEvent e)
    {
                                    m_tree.repaint();
    JOptionPane.showMessageDialog(FileTree3.this,
    "Rename option is not implemented",
    "Info", JOptionPane.INFORMATION_MESSAGE);
    }
    };
    m_popup.add(a2);
    m_tree.add(m_popup); WindowListener wndCloser = new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    };
    addWindowListener(wndCloser); setVisible(true);
    } DefaultMutableTreeNode getTreeNode(TreePath path)
    {
    return (DefaultMutableTreeNode)(path.getLastPathComponent());
    } FileNode getFileNode(DefaultMutableTreeNode node)
    {
    if (node == null)
    return null;
    Object obj = node.getUserObject();
    if (obj instanceof IconData)
    obj = ((IconData)obj).getObject();
    if (obj instanceof FileNode)
    return (FileNode)obj;
    else
    return null;
    }
      

  2.   

    class DirExpansionListener implements TreeExpansionListener
        {
            public void treeExpanded(TreeExpansionEvent event)
            {
                final DefaultMutableTreeNode node = getTreeNode(
                    event.getPath());
                final FileNode fnode = getFileNode(node);            Thread runner = new Thread()
                {
                  public void run()
                  {
                    if (fnode != null && fnode.expand(node))
                    {
                      Runnable runnable = new Runnable()
                      {
                        public void run()
                        {
                           m_model.reload(node);
                        }
                      };
                      SwingUtilities.invokeLater(runnable);
                    }
                  }
                };
                runner.start();
            }        public void treeCollapsed(TreeExpansionEvent event) {}
        } public static void main(String argv[])
    {
    new FileTree3();
    }
    }class IconCellRenderer
    extends    JCheckBox
    implements TreeCellRenderer
    {
    protected Color m_textSelectionColor;
    protected Color m_textNonSelectionColor;
    protected Color m_bkSelectionColor;
    protected Color m_bkNonSelectionColor;
    protected Color m_borderSelectionColor; protected boolean m_selected; public IconCellRenderer()
    {
    super();
    m_textSelectionColor = UIManager.getColor(
    "Tree.selectionForeground");
    m_textNonSelectionColor = UIManager.getColor(
    "Tree.textForeground");
    m_bkSelectionColor = UIManager.getColor(
    "Tree.selectionBackground");
    m_bkNonSelectionColor = UIManager.getColor(
    "Tree.textBackground");
    m_borderSelectionColor = UIManager.getColor(
    "Tree.selectionBorderColor");
    setOpaque(false);
    } public Component getTreeCellRendererComponent(JTree tree,
    Object value, boolean sel, boolean expanded, boolean leaf,
    int row, boolean hasFocus) {
    DefaultMutableTreeNode node =
    (DefaultMutableTreeNode)value;
    Object obj = node.getUserObject();
    setText(obj.toString());                if (obj instanceof Boolean)
                      setText("Retrieving data..."); if (obj instanceof IconData)
    {
    IconData idata = (IconData)obj;
    if (expanded)
    setSelected(true);
    else
    setSelected(false);
    }
    else
    setSelected(false); setFont(tree.getFont());
    setForeground(sel ? m_textSelectionColor :
    m_textNonSelectionColor);
    setBackground(sel ? m_bkSelectionColor :
    m_bkNonSelectionColor);
    m_selected = sel;
    return this;
    }
      

  3.   

    public void paintComponent(Graphics g)
    {
    Color bColor = getBackground();
    Icon icon = getIcon(); g.setColor(bColor);
    int offset = 0;
    if(icon != null && getText() != null)
    offset = (icon.getIconWidth() + getIconTextGap());
    g.fillRect(offset, 0, getWidth() - 1 - offset,
    getHeight() - 1); setSelected(m_selected); super.paintComponent(g);
        }
    }class IconData
    {
    protected Icon   m_icon;
    protected Icon   m_expandedIcon;
    protected Object m_data; public IconData(Icon icon, Object data)
    {
    m_icon = icon;
    m_expandedIcon = null;
    m_data = data;
    } public IconData(Icon icon, Icon expandedIcon, Object data)
    {
    m_icon = icon;
    m_expandedIcon = expandedIcon;
    m_data = data;
    } public Icon getIcon()
    {
    return m_icon;
    } public Icon getExpandedIcon()
    {
    return m_expandedIcon!=null ? m_expandedIcon : m_icon;
    } public Object getObject()
    {
    return m_data;
    } public String toString()
    {
    return m_data.toString();
    }
    }class FileNode
    {
    protected File m_file; public FileNode(File file)
    {
    m_file = file;
    } public File getFile()
    {
    return m_file;
    } public String toString()
    {
    return m_file.getName().length() > 0 ? m_file.getName() :
    m_file.getPath();
    } public boolean expand(DefaultMutableTreeNode parent)
    {
    DefaultMutableTreeNode flag =
    (DefaultMutableTreeNode)parent.getFirstChild();
    if (flag==null)   // No flag
    return false;
    Object obj = flag.getUserObject();
    if (!(obj instanceof Boolean))
    return false;      // Already expanded parent.removeAllChildren();  // Remove Flag File[] files = listFiles();
    if (files == null)
    return true; Vector v = new Vector(); for (int k=0; k<files.length; k++)
    {
    File f = files[k];
    if (!(f.isDirectory()))
    continue; FileNode newNode = new FileNode(f); boolean isAdded = false;
    for (int i=0; i<v.size(); i++)
    {
    FileNode nd = (FileNode)v.elementAt(i);
    if (newNode.compareTo(nd) < 0)
    {
    v.insertElementAt(newNode, i);
    isAdded = true;
    break;
    }
    }
    if (!isAdded)
    v.addElement(newNode);
    } for (int i=0; i<v.size(); i++)
    {
    FileNode nd = (FileNode)v.elementAt(i);
    IconData idata = new IconData(FileTree3.ICON_FOLDER,
    FileTree3.ICON_EXPANDEDFOLDER, nd);
    DefaultMutableTreeNode node = new
    DefaultMutableTreeNode(idata);
    parent.add(node); if (nd.hasSubDirs())
    node.add(new DefaultMutableTreeNode(
    new Boolean(true) ));
    } return true;
    } public boolean hasSubDirs()
    {
    File[] files = listFiles();
    if (files == null)
    return false;
    for (int k=0; k<files.length; k++)
    {
    if (files[k].isDirectory())
    return true;
    }
    return false;
    } public int compareTo(FileNode toCompare)
    {
    return  m_file.getName().compareToIgnoreCase(
    toCompare.m_file.getName() );
    } protected File[] listFiles()
    {
    if (!m_file.isDirectory())
    return null;
    try
    {
    return m_file.listFiles();
    }
    catch (Exception ex)
    {
    JOptionPane.showMessageDialog(null,
    "Error reading directory "+m_file.getAbsolutePath(),
    "Warning", JOptionPane.WARNING_MESSAGE);
    return null;
    }
    }
    }
      

  4.   

    checkbox的主要是通过IconCellRenderer这个类
    来实现的,这个还有读系统目录的功能。
      

  5.   

    谢谢楼上的好心人,您的代码我大概浏览了一下,哇,好难啊。看来我要实现的功能对我这个初学者来还真是一个挑战啊。小弟会好好的分析您给的代码。
    其他的高手还有什么见解吗,请继续指导啊。(最好用简单一点的代码先实现最基本的checkbox+Jtree,让小弟先有一个大体的思路,然后再逐步完善)
    再次谢谢“键之舞者”!
      

  6.   

    另外,请问“键之舞者“怎么才能实现可以对checkbox进行多选啊?(现在您给我设计的只能进行单选)
      

  7.   

    csdn上面果然有高手啊。
    以前就听说过这个论坛,但是一直没有注册。现在刚注册就发现真是个好地方。
    可以长见识,学知识啊。
    楼主的这个问题已经困扰我很长时间了。
    “键之舞者”真厉害,您的代码我运行过,的确不错。
    但是有许多地方我读不懂,所以没法提炼出我要实现的功能。
    如果身边有您这样的高手就好了,我就可以少走许多弯路了。
    键之舞者,您能对您的代码的大体实现过程或者思想做一个简单的介绍吗。
    小妹我认真的看了两遍了还是不太清楚。
    在这还是谢谢您了,还有楼主。
      

  8.   

    呵呵,大家实在太客气了。 
     DefaultTreeSelectionModel selectionModel = new DefaultTreeSelectionModel();
     selectionModel.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
     m_tree.setSelectionModel(selectionModel);
    在构造方法里面,加入上面三条语句就能够实现,多选了,不过要按住shift健,才行。
      

  9.   

    一个比较基本的例子import javax.swing.*;
    import javax.swing.tree.TreeCellRenderer;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeSelectionModel;
    import javax.swing.tree.TreeSelectionModel;
    import java.awt.*;
    public class TestTree extends JFrame {
      private JTree m_tree;
      public TestTree(){
        m_tree = new JTree(new String[]{"A","B","C","D","E"});
        m_tree.setCellRenderer(new IconCellRenderer());
        DefaultTreeSelectionModel selectionModel = new DefaultTreeSelectionModel();
         selectionModel.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
         m_tree.setSelectionModel(selectionModel);    this.getContentPane().add(m_tree);
        this.setSize(300,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.show();  }
      public static void main(String[] args){
         new TestTree();
      }
      class IconCellRenderer
        extends    JCheckBox
        implements TreeCellRenderer
    {    protected Color m_textSelectionColor;
        protected Color m_textNonSelectionColor;
        protected Color m_bkSelectionColor;
        protected Color m_bkNonSelectionColor;
        protected Color m_borderSelectionColor;    protected boolean m_selected;    public IconCellRenderer()
        {
            super();
            m_textSelectionColor = UIManager.getColor(
                "Tree.selectionForeground");
            m_textNonSelectionColor = UIManager.getColor(
                "Tree.textForeground");
            m_bkSelectionColor = UIManager.getColor(
                "Tree.selectionBackground");
            m_bkNonSelectionColor = UIManager.getColor(
                "Tree.textBackground");
            m_borderSelectionColor = UIManager.getColor(
                "Tree.selectionBorderColor");
            setOpaque(false);
        }    public Component getTreeCellRendererComponent(JTree tree,
                                                      Object value, boolean sel, boolean expanded, boolean leaf,
                                                      int row, boolean hasFocus)    {
            DefaultMutableTreeNode node =
                (DefaultMutableTreeNode)value;
            Object obj = node.getUserObject();
            setText(obj.toString());                if (obj instanceof Boolean)
                      setText("Retrieving data...");        if (obj instanceof IconData)
            {
                IconData idata = (IconData)obj;
                if (expanded)
                    setSelected(true);
                else
                    setSelected(false);
            }
            else
                setSelected(false);        setFont(tree.getFont());
            setForeground(sel ? m_textSelectionColor :
                m_textNonSelectionColor);
            setBackground(sel ? m_bkSelectionColor :
                m_bkNonSelectionColor);
            m_selected = sel;
            return this;
        }    public void paintComponent(Graphics g)
        {
            Color bColor = getBackground();
            Icon icon = getIcon();        g.setColor(bColor);
            int offset = 0;
            if(icon != null && getText() != null)
                offset = (icon.getIconWidth() + getIconTextGap());
            g.fillRect(offset, 0, getWidth() - 1 - offset,
                getHeight() - 1);        setSelected(m_selected);        super.paintComponent(g);
        }
    }
    }
      

  10.   

    上面的代码有点问题
    把IconData相关的注释一下
      

  11.   

    谢谢“键之舞者”!
    您上面的代码我运行了,没有什么问题。
    但是小弟现在要设计的东西必须用到checkbox的多选功能,如果只通过按住shift来实现多选肯定是不行的。另外小弟还要向树中加上选择后对应的“处理事件”。不知道对应着checkbox的相应的事件应该加到什么地方。还请您费点心再指导一下,谢谢您了!
      

  12.   

    http://jroller.com/page/santhosh?entry=jtree_with_checkboxes
      

  13.   

    其实,我对这里也不熟悉
    下面这个例子能够多选。import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Vector;
    public class TestTree extends JFrame {
      private JTree m_tree;
      //The vector used to save the selected TreePaths.
      private Vector m_selectPaths;
      public TestTree(){
        m_tree = new JTree(new String[]{"A","B","C","D","E"});
        m_selectPaths = new Vector();
        m_tree.setCellRenderer(new IconCellRenderer());
        DefaultTreeSelectionModel selectionModel = new DefaultTreeSelectionModel();
         selectionModel.setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        m_tree.setSelectionModel(selectionModel);
        m_tree.addMouseListener(new MouseEventListener());
        this.getContentPane().add(m_tree);
        this.setSize(300,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.show();  }
      public static void main(String[] args){
         new TestTree();
      }
      class IconCellRenderer
        extends    JCheckBox
        implements TreeCellRenderer
    {
        protected DefaultMutableTreeNode treeNode;
        protected boolean m_selected;    public IconCellRenderer()
        {
            super();
            setOpaque(false);
        }    public Component getTreeCellRendererComponent(JTree tree,
                                                      Object value, boolean sel, boolean expanded, boolean leaf,
                                                      int row, boolean hasFocus)
        {
            DefaultMutableTreeNode node =
                (DefaultMutableTreeNode)value;
            this.treeNode = node;
            Object obj = node.getUserObject();
            setText(obj.toString());
            setSelected(sel);
            return this;
        }    public void paintComponent(Graphics g)
        {
            Color bColor = getBackground();
            Icon icon = getIcon();        g.setColor(bColor);
            int offset = 0;
            if(icon != null && getText() != null)
                offset = (icon.getIconWidth() + getIconTextGap());
            g.fillRect(offset, 0, getWidth() - 1 - offset,
                getHeight() - 1);
            super.paintComponent(g);
        }
    }
      class MouseEventListener extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
          if(m_selectPaths.contains(m_tree.getPathForLocation(e.getX(), e.getY()))){
            m_selectPaths.remove(m_tree.getPathForLocation(e.getX(), e.getY()));      } else {
            m_selectPaths.add(m_tree.getPathForLocation(e.getX(), e.getY()));
          }
           m_tree.setSelectionPaths((TreePath[]) m_selectPaths.toArray(new TreePath[0]));
        }
      }
    }
      

  14.   

    再次谢谢"键之舞者"的帮助!
    我现在还想问的一个问题就是,如果想把有关jtree的内容进行彻底的了解,可以随意设计出自己想要的jtree,我应该从什么地方开始学习。我借了许多有关jtree的书,但是都讲的比较简单。什么地方有比较好的有关这方面的资料啊,最好是底层一点的。
    请各位有相关资料的高手指导一下。谢谢了!