Personalizar icones de JTree por node

bom, perguntei isso no basico + ng me respondeu… entao resolvi tentar aki, la vai:

tipo, eu to querendo sabe como eu faco pra muda o icone de apenas 1 node da JTree.

eu tentei pelo DefaultTreeRenderer, seguindo o exemplo do Core Java vol 2, mas tipo, la ele mostra como faz pra troca a fonte, eu fui tenta usa o mesmo metodo pra troca o icone por node… ai deu moh bugada o icone vinha em varios lugares ao invez do node q eu tinha definido

alguem da uma luz ai

Ao invés do TreeRenderer, use o TreeCellRenderer:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/tree/DefaultTreeCellRenderer.html

[quote=escordeiro]Ao invés do TreeRenderer, use o TreeCellRenderer:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/tree/DefaultTreeCellRenderer.html[/quote]

vc podia me dar um exemplo de uso plz?

JavaAlmanac diz: http://javaalmanac.com/egs/javax.swing.tree/DefIcons.html

galera, eu ja sei isso ai q vcs tao dizendo… oq eu n consigo eh definir o icone por Node!!! eu quero personalizar cada node da tree, e n somente definir o open, closed e leaf padroes…

consegui (ufa), o problema eh q eu tava definindo:

setClosedIcon();
setOpenIcon();
setLeafIcon();

enqto no renderer vc soh deve definir:

setIcon();

vo manda o exemplo completo pra quem quizer:

[code]import java.awt.;
import java.awt.event.
;
import javax.swing.;
import javax.swing.tree.
;

public class TreeEditTest extends JFrame implements ActionListener {
private DefaultTreeModel model;
private JTree tree;
private JButton addSiblingButton, addChildButton, deleteButton, editButton;

public TreeEditTest() {
    setTitle("TreeEditTest");
    setSize(300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    TreeNode root = makeSampleTree();
    model = new DefaultTreeModel(root);
    tree = new JTree(model);
    tree.setEditable(true);
    tree.setCellRenderer(new RenderizarTree());
    
    Container contentPane = getContentPane();
    JScrollPane scrollPane = new JScrollPane(tree);
    contentPane.add(scrollPane, "Center");
    
    JPanel panel = new JPanel();
    addSiblingButton = new JButton("Add Sibling");
    addSiblingButton.addActionListener(this);
    panel.add(addSiblingButton);
    
    addChildButton = new JButton("Add Child");
    addChildButton.addActionListener(this);
    panel.add(addChildButton);
    
    deleteButton = new JButton("Delete");
    deleteButton.addActionListener(this);
    panel.add(deleteButton);
    
    contentPane.add(panel, "South");
}

public TreeNode makeSampleTree() {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
    DefaultMutableTreeNode contry = new DefaultMutableTreeNode("USA");
    root.add(contry);
    DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
    contry.add(state);
    DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
    state.add(city);
    city = new DefaultMutableTreeNode("Cupertino");
    state.add(city);
    state = new DefaultMutableTreeNode("Michigan");
    contry.add(state);
    city = new DefaultMutableTreeNode("Ann Arbor");
    state.add(city);
    contry = new DefaultMutableTreeNode("Germany");
    root.add(contry);
    state = new DefaultMutableTreeNode("Schleswig-Holstein");
    contry.add(state);
    city = new DefaultMutableTreeNode("Kiel");
    state.add(city);
    
    return root;
}

public void actionPerformed(ActionEvent evt) {
    DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    
    if(selectedNode == null)
        return;
    
    if(evt.getSource().equals(deleteButton)) {
        if(selectedNode.getParent() != null)
            model.removeNodeFromParent(selectedNode);
        return;
    }
    
    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
    
    if(evt.getSource().equals(addSiblingButton)) {
        DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
        
        if(parent != null) {
            int selectedIndex = parent.getIndex(selectedNode);
            model.insertNodeInto(newNode, parent, selectedIndex + 1);
        }
    } else if(evt.getSource().equals(addChildButton)) {
        model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
    }
    
    TreeNode[] nodes = model.getPathToRoot(newNode);
    TreePath path = new TreePath(nodes);
    tree.scrollPathToVisible(path);
}

public static void main(String[] args) {
    new TreeEditTest().setVisible(true);
}

}

class RenderizarTree extends DefaultTreeCellRenderer implements TreeCellRenderer {
private Font plainFont, italicFont;

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
    if(node.toString().equals("USA")) {
        setIcon(new ImageIcon("iconTest.gif"));
    }
    
    return this;
}

}[/code]

Reaproveitando este tópido… haveria algum modo de alterar os sinais de abertura e fechamento no caso do windows são sinais de + e -, haveria como alterar os valores padrões no java?

Muito fácil
vc pode mudar o + e - da arvore simplismente alterando o lookandfeel
do java
vc pode faze assim ó

------------------------------MyLookAndFeel.java-------------------------------

import java.awt.Color;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class MyLookAndFeel extends MetalLookAndFeel
{

public MyLookAndFeel ()
{
super();

   UIManager.put("Tree.openIcon", new ImageIcon("caminho da imagem"));
    UIManager.put("Tree.leafIcon",new ImageIcon("caminho da imagem"));    
    UIManager.put("Tree.closedIcon", new ImageIcon("caminho da imagem"));
    UIManager.put("Tree.line", new Color(0, 0, 0));        
    UIManager.put("Tree.expandedIcon",new ImageIcon("caminho da imagem"));
    UIManager.put("Tree.collapsedIcon", new ImageIcon("caminho da imagem"));    
    
 
        }


public String getDescription()
{        
    return "LookAndFeel personalizado.";
}


public String getID()
{        
    return "myLookAndFeel";
}


public String getName()
{        
    return "myLookAndFeel";
}


public boolean isNativeLookAndFeel()
{        
    return false;
}


public boolean isSupportedLookAndFeel()
{        
    return true;
}

protected void initClassDefaults(UIDefaults tabela)    
{
    super.initClassDefaults(tabela);
    
}

}

Ai e so instala o lookand feel na sua aplicação com o codigo

String plaf="“seuspackage.MyLookAndFeel”";
try
{
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(comp);
}
catch(Exception e)
{
e.printStackTrace();
}

Na classe vc pode da um
extends MetalLookAndFeel ou
extends MotifLookAndFeel ou
extends WindowsLookAndFeel ou
extends BasicLookAndFeel
para personalizar os icone de qualquer um destes look and feel
valeu!!!