Search code examples
javaswingjtree

Dynamically set icon for a tree node per user selection


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

Solution

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