Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

getTreeCellRendererComponent (defaultTreeCellrenderer )problem

800408Feb 8 2007 — edited Feb 8 2007
Hi All,
i build a jtree.
i made a mouse event when i click(select) a node i activate
a class that is override the defaultTreeCellrenderer in order to change the icon of this node.
it working fine on the first time .
when i select other node with more childrens below i got exception and that because the getTreeCellRendererComponent run every time you click the node:
public class MyMouseListener extends MouseAdapter {

	JTree tree;
	Icon SelIcon;
	Icon NoTSelIcon;
	Color frameColor;
	int NumOfNodeUnderselect;
	int NodesInTree;
	public static int NodeInx=0;
	private static boolean[] isChecked;
	private DefaultMutableTreeNode[] AllNodes;
	private int Total_node_number;
	
	boolean singleClick = true;
	javax.swing.Timer timer;
	int mouseDoubleClickThreshold = 200; 
	private MouseEvent Me;
	
	public MyMouseListener(JTree tree,Icon SelIcon,Icon NoTSelIcon,Color Bacground,int NodesInTree,DefaultMutableTreeNode[] AllNodesArray,boolean[]CheckedArray) 
	{
		// TODO Auto-generated constructor stub
	   this.tree=tree;
	   this.SelIcon = SelIcon;
   	   this.NoTSelIcon = NoTSelIcon;
   	   this.frameColor=Bacground;
  	   this.NodesInTree=NodesInTree;
  	   isChecked=CheckedArray;
    	
       //init ARRAY OF ALL NODES
  	   Total_node_number=NodesInTree;
  	   this.AllNodes=AllNodesArray;
		
		timer = new javax.swing.Timer(mouseDoubleClickThreshold, new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(singleClick)
		        {
		      	  mySingleClick();
		      	
		        }
			}
		});
		  timer.setRepeats(false);   
	}
	
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		//	System.out.println("mousePressed");
		Me=e;
		checkClicks(e);
	  }
	
	private void mySingleClick()
	{
		System.out.println("mySingleClick");
		int selRow = tree.getRowForLocation(Me.getX(), Me.getY());
 //       TreePath selPath = tree.getPathForLocation(Me.getX(), Me.getY());
        DefaultMutableTreeNode Mousenode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
        try{
       	 String NodeName = (String)Mousenode.getUserObject();
       	 System.out.println("NodeName="+NodeName);
        }
        catch(NullPointerException Nop){
       	 System.out.println("NullPointerException");
       	 return;
        }

        if(selRow != -1) 
        {
        	DefaultMutableTreeNode Selnode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
			String Name = (String)Selnode.getUserObject();
				
			int num_of_nod_below_sel=getNodeCountBelow((TreeModel)tree.getModel() , Selnode, true);
		
			System.out.println("The Number of nodes under "+Name+"="+num_of_nod_below_sel);
			
			IconRenderer SeleIcon=new IconRenderer(SelIcon,NoTSelIcon,frameColor,num_of_nod_below_sel,Total_node_number,AllNodes,isChecked);
			
			tree.setCellRenderer(SeleIcon);
       	 
        }
	}
	
	private void myDoubleClick()
	{
		System.out.println("myDoubleClick");
	}

		
	public void checkClicks(MouseEvent me)
	  {
	    if(me.getClickCount() == 1)
	    {
	      singleClick = true;
	      timer.start();
	    }
	    else
	    {
	      singleClick = false;
	      myDoubleClick();
	      
	    }
	  }
	
    //GETTING NODE NUMBER BELOWS THE SELECTED ONE
    public int getNodeCountBelow(TreeModel model, Object node, boolean includeInitialNode)
    {
        int n = includeInitialNode ? 1 : 0;
        for (int i = 0; i < model.getChildCount(node); i ++)
        {
            n += getNodeCountBelow(model, model.getChild(node, i), true);
            
        }
        return n;
    }

}

public class IconRenderer extends DefaultTreeCellRenderer {
	
	private static final long serialVersionUID = 1L;
	Icon SelectedIcon;
	Icon NotSelectedIcon;
	Color BackgroundColor;
	DefaultMutableTreeNode SelctedNode=null;
	int NumOfNodeUnderselect;
	int NumOfNodesInTree;
	public static int NodeInx=0;
	private static boolean[] isChecked;
	
	
	private DefaultMutableTreeNode[] SelectedNodes;
	private DefaultMutableTreeNode[] EntireTreeNodes;
	

    public IconRenderer(Icon SelIcon,Icon NoTSelIcon,Color Bacground,int NumOfSelectNodes,int NodesInTree,DefaultMutableTreeNode[] AllNodesArray,boolean[]CheckedArray) 
    {
    	SelectedIcon = SelIcon;
    	NotSelectedIcon = NoTSelIcon;
    	BackgroundColor=Bacground;
   	
    	NumOfNodeUnderselect=NumOfSelectNodes;
    	NumOfNodesInTree=NodesInTree;
   	
    	isChecked=CheckedArray;
     	
        //init ARRAY OF ALL SelectedNODES
    	SelectedNodes=new DefaultMutableTreeNode[NumOfNodeUnderselect];
    	EntireTreeNodes=AllNodesArray;
    	
    	
    	setBackgroundNonSelectionColor(BackgroundColor);
    }
    
    public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,
    		                                      boolean leaf,int row,boolean hasFocus) 
    {
    	super.getTreeCellRendererComponent(tree, value, sel,expanded, leaf, row,hasFocus);
    	
    	
    	DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
    	    	
    	
    	String NodeName = (String)node.getUserObject();
    	System.out.println("NodeName="+NodeName);
    	
    	
      	
  
    		if(sel)
    			{
    			 NodeInx=0;
    			 SelctedNode =(DefaultMutableTreeNode) value;
    			 setIcon(SelectedIcon);
    			 int number_ofnodes=getNodeCountBelow((TreeModel)tree.getModel() , node, true);
    			 setCheckNodes();
    			 System.out.println("Number of nodes below the selected="+number_ofnodes);
    			}
    		else
    		  	{
    			
    			 //in this method we checking if the entire nodes are child of the selected node
    			 for(int i=0;i<NumOfNodesInTree;i++)
    				 {
    				    if(node.equals(EntireTreeNodes) && isChecked[i] ) 
{
setIcon(SelectedIcon);

break;
}
else
{
setIcon(NotSelectedIcon);
}
}
}


return this;
}

// GETTING which nodes are select
public int getNodeCountBelow(TreeModel model, Object node, boolean includeInitialNode)
{
int n = includeInitialNode ? 1 : 0;
int ChildCount= model.getChildCount(node);

SelectedNodes[NodeInx]=(DefaultMutableTreeNode) node;
NodeInx++;

for (int i = 0; i < ChildCount; i ++)
{

n += getNodeCountBelow(model, model.getChild(node, i), true);

}

return n;
}

private void setCheckNodes()
{
for(int k=0;k<NumOfNodeUnderselect;k++)
{
for(int i=0;i<NumOfNodesInTree;i++)
{
if(EntireTreeNodes[i].equals(SelectedNodes[k]))
isChecked[i]=true ;
}
}


}



}


my question is specific :
how can i get out from getTreeCellRendererComponent and not each time i made some changes it just to run again inside this class.

Hope i was clear

Thanks
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Mar 8 2007
Added on Feb 8 2007
5 comments
294 views