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