user3164187
user3164187

Reputation: 1432

Jtree Select only Child Node and not Parent

I am using a Jtree where am stuck at a place to do the below,

Diagram

From Fig:2 I click on A(Check box) and all its child is getting selected - It's fine

From Fig:3 I Clicked D(CheckBox) and all its parents (A,B,C) are also geting selected.

Now what i want to do is,

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

The Code i use is:

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; 
            }

The isPathSelected Method:

// 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; 
        } 

Am not sure whether am doing it roght am new to Jtree. Please help

Upvotes: 1

Views: 2101

Answers (1)

Martin Frank
Martin Frank

Reputation: 3454

you must 'walk through' the child nodes from the tree element:

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);
    }
}

this is a recursive call, and it's only a snippet, but it should work this way... maybe it needs some other parameters on the 'walkThrough'-methode...

i'm asserting that your object (value) is a DefaultMutableTreeNode as described on http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html

Upvotes: 1

Related Questions