getTreeCellRendererComponent (defaultTreeCellrenderer )problem
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:
publicclass MyMouseListenerextends MouseAdapter{
JTree tree;
Icon SelIcon;
Icon NoTSelIcon;
Color frameColor;
int NumOfNodeUnderselect;
int NodesInTree;
publicstaticint NodeInx=0;
privatestaticboolean[] isChecked;
private DefaultMutableTreeNode[] AllNodes;
privateint 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()
{
publicvoid actionPerformed(ActionEvent e)
{
if(singleClick)
{
mySingleClick();
}
}
});
timer.setRepeats(false);
}
publicvoid mousePressed(MouseEvent e){
// TODO Auto-generated method stub
//System.out.println("mousePressed");
Me=e;
checkClicks(e);
}
privatevoid 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);
}
}
privatevoid myDoubleClick()
{
System.out.println("myDoubleClick");
}
publicvoid checkClicks(MouseEvent me)
{
if(me.getClickCount() == 1)
{
singleClick =true;
timer.start();
}
else
{
singleClick =false;
myDoubleClick();
}
}
//GETTING NODE NUMBER BELOWS THE SELECTED ONE
publicint 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;
}
}
publicclass IconRendererextends DefaultTreeCellRenderer{
privatestaticfinallong serialVersionUID = 1;
Icon SelectedIcon;
Icon NotSelectedIcon;
Color BackgroundColor;
DefaultMutableTreeNode SelctedNode=null;
int NumOfNodeUnderselect;
int NumOfNodesInTree;
publicstaticint NodeInx=0;
privatestaticboolean[] 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[i]) && isChecked[i] )
{
setIcon(SelectedIcon);
break;
}
else
{
setIcon(NotSelectedIcon);
}
}
}
returnthis;
}
// GETTING which nodes are select
publicint 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;
}
privatevoid 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>

