Java Jtree只选择子节点而不选择父节点

Java Jtree只选择子节点而不选择父节点,java,swing,jtree,Java,Swing,Jtree,我正在使用一个Jtree,我被困在一个地方做下面的事情 从图2中我点击一个(复选框),它的所有子项都被选中-很好 来自图3 我单击了D(复选框),它的所有父项(A、B、C)也都被选中。 现在我想做的是 If i select A -> A,B,C,D will eb selected If i Select B-> only B,C,D If c -> C,D If D-> Only D 我使用的代码是: public Component getTreeCellRen

我正在使用一个Jtree,我被困在一个地方做下面的事情

从图2中
我点击一个(复选框),它的所有子项都被选中-很好

来自图3
我单击了D(复选框),它的所有父项(A、B、C)也都被选中。

现在我想做的是

If i select A -> A,B,C,D will eb selected
If i Select B-> only B,C,D
If c -> C,D
If D-> Only D
我使用的代码是:

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){ 

                //delegate is TreeCellrenderer
                Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); 
                TreePath path = tree.getPathForRow(row);
                if(path!=null)
                {         
                    //Selection Model is TreeSelection Model
                    if(selectionModel.isPathSelected(path, true)) //Below code.
                    {       
                        checkBox.setState(checkBox.SELECTED);   
                        if (selected) 
                        {
                            //Comes here If check box is selected by mouse click
                        }
                    }
                    else
                    {                       
                        checkBox.setState(checkBox.NOT_SELECTED);   
                    }
                } 
                add(checkBox, BorderLayout.WEST); 
                add(renderer, BorderLayout.CENTER);  
                return this; 
            }
isPathSelected方法:

// tells whether given path is selected. 
        // if dig is true, then a path is assumed to be selected, if 
        // one of its ancestor is selected. 
        public boolean isPathSelected(TreePath path, boolean dig){                      
            if(!dig){
                return super.isPathSelected(path); 
            }

            while(path!=null && !super.isPathSelected(path)){
                path = path.getParentPath(); 
            }

            return path!=null; 
        } 

我不确定我是不是刚开始做这件事。请提供帮助

您必须从树元素“遍历”子节点:

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
    walkThroug(node, isSelected);
}

private void walkThrough(DefaultMutableTreeNode node, boolean isSelected) {
    int cc = node.getChildCount();

    //TODO select current node
    //something like: node.setSelected(isSelected)

    for(int i = 0; i < cc; i++){
        DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
        walkThrough(childNode, isSelected);
    }
}
公共组件GetTreeCellRenderComponent(JTree树,对象值,布尔选定,布尔展开,布尔叶,int行,布尔hasFocus){ DefaultMutableTreeNode=(DefaultMutableTreeNode)值; 演练(节点,已选择); } 私有void演练(DefaultMutableTreeNode节点,选择布尔值){ int cc=node.getChildCount(); //TODO选择当前节点 //类似于:node.setSelected(isSelected) 对于(int i=0;i 这是一个递归调用,它只是一个片段,但它应该以这种方式工作。。。也许它需要一些关于“漫游”方法的其他参数


我断言您的对象(值)是一个DefaultMutableTreeNode,如

中所述。为了更快地获得更好的帮助,请发布一个(最小、完整、可验证的示例)。同意MCVE/SSCCE,因为问题是关于TreeCellEditor和在TreeModel中迭代的