IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Changer police de puisieurs noeuds JTREE


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut Changer police de puisieurs noeuds JTREE
    Bonjour,

    Comme le montre le code ci-dessous, j'ai envie de changer la forme de mon JTREE. J'utilise alors un Renderer. (ci-dessous, le code change la couleur de mon jtree).
    Par contre ça change tout mon JTREE. Or j'ai juste besoin de mettre en gras les nœuds ayant certains attribues.

    Le soucis c'est que je n'arrive pas a filtrer sur les attributs de mes nœuds, sachant que le Renderer les considère en STRING. Je sais donc pas comment faire le tri..
    grosso modo, j'aimerai savoir s'il est possible d'envoyer un argument à mon rederer pour faire le filtre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    public class MyTreeCellRenderer extends DefaultTreeCellRenderer {
     
        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
            super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);
     
           // Assuming you have a tree of Strings
            String node = (String) ((DefaultMutableTreeNode) value).getUserObject();       
     
            // If the node is a leaf and ends with "xxx"	
          /*  if (leaf && node.endsWith("red")) {
                // Paint the node in blue
                setForeground(new Color(13, 57 ,115));
            }*/
     
     
            setForeground(new Color(13, 57 ,115));
     
            return this;
        }
    }

    voilà comment j'appel mon Renderer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tree.setCellRenderer(new MyTreeCellRenderer());
    Merci d'avance

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Si tu as bien mis un objet dans les TreeNode (autre que String), alors tu devrais dans le renderer pouvoir tester le type d'objet avec un instanceof et faire ce que tu veux au niveau du rendus.

    Mais si tu as mis des String alors tu risques de ne pouvoir rien faire.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Si tu as bien mis un objet dans les TreeNode (autre que String), alors tu devrais dans le renderer pouvoir tester le type d'objet avec un instanceof et faire ce que tu veux au niveau du rendus.

    Mais si tu as mis des String alors tu risques de ne pouvoir rien faire.

    Hummm je ne sais pas, j'ai créé des nœuds grâce ç une fonction récursives. Mais l'arbre JTree est construit à partir d'un fichier XML parsé.
    Dans mon fichier xml, les nœud comporte plusieurs attributs. Je voulais donc différencier les nœud en fonction de leur attributs...

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Et bien je suppose que dans ta fonction récursive se trouve la réponse a ma question.

    La ou tu fais un ou des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new DefaultMutableTreeNode(monobjet)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Et bien je suppose que dans ta fonction récursive se trouve la réponse a ma question.
    La ou tu fais un ou des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new DefaultMutableTreeNode(monobjet)
    Oui en effet, j'ai fait comme tu me la dis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    public class MyTreeCellRenderer extends DefaultTreeCellRenderer {
     
     
    public static DefaultMutableTreeNode n;
     
        public MyTreeCellRenderer(DefaultMutableTreeNode node) {
     
        	this.n = node;
     
        }
     
    	@Override
        public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
            super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);
     
          // Assuming you have a tree of Strings
         //   String node = (String) ((DefaultMutableTreeNode) value).getUserObject();
              String node =(String) n.getUserObject();
     
            setForeground(new Color(13, 57 ,115));
     
            return this;
        }
    }
    Mais tous tous mon jtree est en ble...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tree.setCellRenderer(new MyTreeCellRenderer(noeud))
    Voilà comment j'appelle mon renderer. Je l'appelle dans une fonction ou j'ai déjà filtrer normalement :/

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Je pense qu'il ne faut pas passer de DefaultMutableTreeNode dans le renderer. Déjà c'est à supprimer.

    Ensuite je réitère ma question concernant le remplissage de l'arbre et la création des DefaultMutableTreeNode qui n'a jamais été montré (de manière succincte) sur ce post.

    Sion, Le lien que j'ai fournis précédemment, tu devrais le lire et essayer de le reproduire.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Enfin sinon, voici un petit exemple fait à la va vite mais qui te permettra peut être de mieux appréhender les choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.border.EmptyBorder;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
     
    /**
     * 
     */
    public class mainframe_TreeTest extends JFrame
    {
     
    	private JPanel contentPane;
    	private JScrollPane scrollPane;
    	private JTree tree;
     
    	/**
             * Launch the application.
             */
    	public static void main(String[] args)
    	{
    		EventQueue.invokeLater(new Runnable()
    		{
    			public void run()
    			{
    				try
    				{
    					mainframe_TreeTest frame = new mainframe_TreeTest();
    					frame.setVisible(true);
    				} catch (Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the frame.
             */
    	public mainframe_TreeTest()
    	{
    		initialize();
    	}
    	private void initialize() {
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setBounds(100, 100, 450, 300);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		contentPane.setLayout(new BorderLayout(0, 0));
    		setContentPane(contentPane);
    		contentPane.add(getScrollPane(), BorderLayout.CENTER);
    	}
     
    	private JScrollPane getScrollPane() {
    		if (scrollPane == null) {
    			scrollPane = new JScrollPane();
    			scrollPane.setViewportView(getTree());
    		}
    		return scrollPane;
    	}
    	private JTree getTree() {
    		if (tree == null) {
    			DefaultMutableTreeNode top = new DefaultMutableTreeNode("Root node");
     
    			tree = new JTree(top);
    			tree.setCellRenderer(new MyTreeNodeRenderer());
     
     
    			// Fill tree
    			top.add(new DefaultMutableTreeNode(new DTOObjectwithAttributes(false, 11, "Hello 1")));
    			top.add(new DefaultMutableTreeNode(new DTOObjectwithAttributes(true, 22, "Hello 2")));
    			top.add(new DefaultMutableTreeNode(new DTOObjectwithAttributes(true, 33, "Hello 3")));
    			top.add(new DefaultMutableTreeNode(new DTOObjectwithAttributes(false, 44, "Hello 4")));
     
    			tree.expandRow(0);
    		}
    		return tree;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public class DTOObjectwithAttributes
    {
    	boolean isBlue;
     
    	int Value;
     
    	String Label;
     
    	/**
             * @param isBlue
             * @param value
             * @param label
             */
    	protected DTOObjectwithAttributes(boolean isBlue, int value, String label)
    	{
    		super();
    		this.isBlue = isBlue;
    		Value = value;
    		Label = label;
    	}
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import java.awt.Color;
    import java.awt.Component;
     
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
     
    /**
     * 
     */
     
    /**
     * @author Warnotte Renaud
     */
    public class MyTreeNodeRenderer extends DefaultTreeCellRenderer
    {
    	@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);
     
    		if (value instanceof DefaultMutableTreeNode)
    		{
    			value = ((DefaultMutableTreeNode) value).getUserObject();
    		}
     
    		if (value instanceof DTOObjectwithAttributes)
    		{
    			DTOObjectwithAttributes obj = (DTOObjectwithAttributes) value;
     
    			if (obj.isBlue)
    				this.setForeground(Color.BLUE);
     
    			this.setText(obj.Label+" ("+obj.Value+") ");
    		}
     
     
    		return this;
    	}
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Super!

    C'est exactement ça qui me fallait!
    Je te remercie !! Tu m'as beaucoup beaucoup aidé!

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Re,

    je me suis inspiré du code que tu m'a fournit qui répond à la problématique.
    Cependant, en l'adaptant à ce que j'avais fait auparavant, quelque chose cloche. Je m'explique, dans l'outil que je développe, les utilisateurs doivent pouvoir sélectionner les nœuds de l'arbre. Les nœuds sont ensuite afficher dans un JtextArea.

    Pour faciliter le travail, j'ai utilisé ton exemple et j'ai rajouté un listener au Jtree de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tree.addMouseListener(new MouseAdapter() {
    				public void mouseClicked(MouseEvent e) {
    					node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    					System.out.print(node.toString()+"\n");
    				}
    			});
    voilà ce que j'obtiens :

    Nom : resultat.PNG
Affichages : 257
Taille : 43,1 Ko

    On voit qu'on en selectionne un nœud, c'est pas ce qui est affiché dans le jtree qui est afficher dans la console. Ma question pour toi, et la communauté, comment modifier le code pour afficher le nom du nœud afficher.. ?

    J'imagine que le probème vient de là, mais c'est vrais que j'ai beau bidouiller, j'arrive pas à trouver la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top.add(new DefaultMutableTreeNode(new DTOObjectwithAttributes(false, 44, "Hello 4")));

    Merci d'avance pour ton aide;
    j

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    C'est normal que dans la console il t'affiche cela ainsi car toString() n'a pas été redéfinie.

    Il faut redéfinir la méthode toString() dans la classe et mettre ce que tu veux voire en terme d'affichage comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String toString() {
            return "Name of the attribute :" + this.label;
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par wax78 Voir le message
    C'est normal que dans la console il t'affiche cela ainsi car toString() n'a pas été redéfinie.

    Il faut redéfinir la méthode toString() dans la classe et mettre ce que tu veux voire en terme d'affichage comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public String toString() {
            return "Name of the attribute :" + this.label;
    }
    En effet, que suis-je bête!
    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème ouverture/fermeture noeud JTree
    Par Rheym dans le forum Composants
    Réponses: 3
    Dernier message: 26/03/2007, 08h34
  2. EVC++4.0 - changer police d'un controle
    Par Teo dans le forum MFC
    Réponses: 1
    Dernier message: 15/02/2007, 10h17
  3. Réponses: 8
    Dernier message: 19/07/2006, 08h24
  4. [VB.NET]Changer police d'un label
    Par flogreg dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/06/2006, 15h49
  5. [c#] Changer police des onglets d'un tabControl
    Par nesquik dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/06/2006, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo