简体   繁体   中英

Dynamically change icon of specific nodes in JTree

I've seen plenty of examples for changing the icon of nodes during tree instantiation, but I'd like a way to dynamically change the icon of an individual node later. So, in my main code I add my custom renderer to my tree:

// Icon I want to set nodes to later
ImageIcon checkIcon = new ImageIcon("check.jpg");

// Creates tree with my nodes
JTree tree = new JTree(nodes.top);

// Create custom renderer
Scenario1Renderer renderer = new Scenario1Renderer();

// Set to single tree selection 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

// Set tree to my custom renderer
//renderer.setRendererIcon(greenIcon);
tree.setCellRenderer(renderer);

My code in the renderer is

public class Scenario1Renderer extends DefaultTreeCellRenderer {

ImageIcon rendererIcon;

    public void setRendererIcon(ImageIcon myIcon){
      this.rendererIcon = myIcon;
    };

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

    Component ret = super.getTreeCellRendererComponent(tree, value,
            selected, expanded, leaf, row, hasFocus);
            //setIcon( rendererIcon ) ;
            return ret;
    } 

So, obviously if I set my rendererIcon, it'll paint all my nodes with the icon I pass in during tree instantiation. I instead want some sort of method that can set the icon of an individual node later on in the execution of my program.

You can have different icons that you can set according to different conditions. Below is a simple example that changes icon of a selected node:

import java.awt.Component;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

public class TestTree {
    private static void createAndShowUI() {
        JFrame frame = new JFrame();
        final JTree tree = new JTree(buildDemoModel());

        tree.setCellRenderer(new DefaultTreeCellRenderer() {
            private Icon loadIcon = UIManager.getIcon("OptionPane.errorIcon");
            private Icon saveIcon = UIManager.getIcon("OptionPane.informationIcon");
            @Override
            public Component getTreeCellRendererComponent(JTree tree,
                    Object value, boolean selected, boolean expanded,
                    boolean isLeaf, int row, boolean focused) {
                Component c = super.getTreeCellRendererComponent(tree, value,
                        selected, expanded, isLeaf, row, focused);
                if (selected)
                    setIcon(loadIcon);
                else
                    setIcon(saveIcon);
                return c;
            }
        });
        tree.setVisibleRowCount(10);
        frame.add(new JScrollPane(tree));

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }

    private static DefaultTreeModel buildDemoModel() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");

        root.add(new DefaultMutableTreeNode("A"));
        root.add(new DefaultMutableTreeNode("B"));
        root.add(new DefaultMutableTreeNode("C"));

        return new DefaultTreeModel(root);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM