没找到源码,只能跟你说原理,自己实现起来也不难
定制树节点的渲染器,这种效果的树节点并不是真正的在前面带了复选框,而只是一个象复选框的图标在那里,自己写个树节点鼠标点击事件改变图标
至于点父节点全选之类都是需要自己写代码来改变图标

解决方案 »

  1.   

    public class MyTreeCellRenderer implements TreeCellRenderer{
            public Component getTreeCellRendererComponent( JTree tree, Object value, boolean selected, boolean expanded,
                                                           boolean leaf, int row, boolean hasFocus )
            {
                DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)value;
                MyTreeCell treeCell = (MyTreeCell)treeNode.getUserObject();
                return treeCell.getRendererComponent();
            }
        }
    每个树节点绑定的对象就是MyTreeCell
    public class MyTreeCell {
        private static final ImageIcon ALL_SELECTED_ICON =
            new ImageIcon(MyTreeCell.class.getResource("allselected.gif"));
        private static final ImageIcon ALL_NOT_SELECTED_ICON = new ImageIcon(MyTreeCell.class.getResource(
            "allnotselected.gif"));
        private static final ImageIcon PARTIAL_SELECTED_ICON = new ImageIcon(MyTreeCell.class.getResource(
            "partialselected.gif"));    private String labelText = null;
        private JLabel label = null;    public MyTreeCell(String labelText, boolean selected) {
            this.labelText = (labelText == null ? "" : labelText);
            ImageIcon icon = ALL_SELECTED_ICON;
            if (selected == false) {
                icon = ALL_NOT_SELECTED_ICON;
            }
            label = new JLabel(labelText, icon, JLabel.HORIZONTAL);
        }    //改变到全选状态图标
        public void changeToAllSelected() {
            label.setIcon(ALL_SELECTED_ICON);
        }    //改变到全不选状态图标
        public void changeToAllNotSelected() {
            label.setIcon(ALL_NOT_SELECTED_ICON);
        }    //改变到半选状态图标
        public void changeToPartialSelected() {
            label.setIcon(PARTIAL_SELECTED_ICON);
        }    public JComponent getRendererComponent() {
            return label;
        }    public String getLabelText() {
            return labelText;
        } }