Personalizar icones de JTree por node

7 respostas
W

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

7 Respostas

E

Ao invés do TreeRenderer, use o TreeCellRenderer:

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

W

escordeiro:
Ao invés do TreeRenderer, use o TreeCellRenderer:

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

vc podia me dar um exemplo de uso plz?

Daniel_Quirino_Olive

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

W

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…

W

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:

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

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?

P

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!!!

Criado 10 de abril de 2005
Ultima resposta 24 de jan. de 2007
Respostas 7
Participantes 5