0

I'm trying to make app to load user data from xml to make a tree model then the user have option to select a piece of data from the tree and set icon for it.

I can successfully load the data from xml file but the problem is i can't set different icon for every node of the tree

Here's how i did

public class DefaultTreeRenderer extends DefaultTreeCellRenderer {

private static final long serialVersionUID = 1L;
private Icon userIcon;
private int getSelecteRow;

public DefaultTreeRenderer(String IconPath,int selected) throws IOException {
    Image img = ImageIO.read(new File(IconPath)) ;  
    Image newimg = img.getScaledInstance( 28, 28,  java.awt.Image.SCALE_SMOOTH ) ;  
    Icon x = new ImageIcon(newimg);
    userIcon= x;
    getSelecteRow = selected;
}

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

   JLabel label = (JLabel) super.getTreeCellRendererComponent(
                    tree, value, sel,
                    expanded, leaf, row,
                    hasFocus);


    if (?!!!) { 
   // This's the missing part, what should i state to set per row icon ?

      label.setIcon(tutorialIcon);
      label.setText(label.getText()+"   √");

  } else{

     }

    return label;
  }
}

the test code :

try {

        jTree1.setCellRenderer(new DefaultTreeRenderer(iconPathTextBox.getText(),jTree1.getMinSelectionRow()));
    } catch (IOException ex) {
        Logger.getLogger(frame.class.getName()).log(Level.SEVERE , null , ex);
    }
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
Nemotatu
  • 1
  • 1
  • 1
    Try the approach shown in [JTree: Set custom open/closed icons for individual groups](http://stackoverflow.com/questions/14096725/jtree-set-custom-open-closed-icons-for-individual-groups). – trashgod Jul 10 '13 at 10:30
  • Thanks trashgod for trying to help. I managed to solve this by making Map for every piece of data on jtree and its icon.By checking if the userObject is equal to the map key then setIcon by getting the key value (icon). – Nemotatu Jul 13 '13 at 19:16
  • You can [answer your own question](http://meta.stackexchange.com/q/17463/163188). – trashgod Jul 13 '13 at 22:56

1 Answers1

0
public class DefaultTreeRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
Map<String,Icon> amap = new HashMap<>();
ArrayList<String > drawList = new ArrayList<>();

public DefaultTreeRenderer(ArrayList<String > list,Map<String,Icon> amap1) throws IOException {

    setData(list,amap1);
}


private void setData(ArrayList<String > lists,Map<String,Icon> amap2){
    amap = amap2;
    drawList = lists;
}

@Override
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);


   Object nodeInfo = ((DefaultMutableTreeNode) value).getUserObject();
   Icon bn = this.leafIcon;

    if (getDrawable(nodeInfo)) {
      setIcon(amap.get(nodeInfo.toString()));     
  } 

   if(this.getIcon()!=null && leaf) {
       setText(nodeInfo.toString()+"       √");
   }
   if(this.getIcon()==null && leaf){
        setIcon(bn);
    }



    return this;
}

protected boolean getDrawable(Object value) {

    String title = value.toString();

    for(String c : drawList){
    if (title.equals(c)) {
        return true;
    }
    }

    return false;
   }
}

Test code:

ArrayList<String> xmllist= new ArrayList<>();
Map<String,Icon> amap = new HashMap<>();

if(g.getName().endsWith("png") ||g.getName().endsWith("jpg") ) {

try {
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                   jTree1.getLastSelectedPathComponent();

    Object nodeInfo = node.getUserObject();
    String hn = imagePathTextBox.getText();

    Image img = ImageIO.read(new File(hn)) ;  
    Image newimg = img.getScaledInstance( 28, 28,  java.awt.Image.SCALE_SMOOTH ) ;  
    Icon x = new ImageIcon(newimg);
    amap.put(nodeInfo.toString() , x);

     jTree1.setCellRenderer(new DefaultTreeRenderer(xmllist,amap));
    } catch (IOException ex) {
        Logger.getLogger(frame.class.getName()).log(Level.SEVERE , null , ex);
    }
  }
Nemotatu
  • 1
  • 1