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

Composants Java Discussion :

Ajouter un Panel aux noeuds d'un arbre (JTree)


Sujet :

Composants Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut Ajouter un Panel aux noeuds d'un arbre (JTree)
    Bonjour à tous,

    Je suis entrain de réaliser un Tree avec Jtree.
    pour la création pas de problème.
    maitenant je veux faire de telle sorte que mon arbre écoute les mouvements de la souris; a ce niveau aussi y'a pas de problème.
    Mon problème est que je veux afficher un panel (en background du noeud) contenant des boutons lorsque le pointeur de la souris se trouve sur un noeud précis de l'arbre.

    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
     
    public class MyClass extend JPanel(){
               //pour la création de l'arbre j'utilise DefaultTreeCellRenderer
     
               //pour le deplacement de la souris je fais ceci
     
                tree.addMouseMotionListener(new MouseMotionListener()
                {
                    public void mouseDragged(MouseEvent mouseEvent)
                    {
                        // j'ai rien mis pour le moment
                    }
     
                    public void mouseMoved(MouseEvent e )
                    {
                        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
                        int selRow = tree.getRowForLocation(e.getX(),e.getY());
                        if (selRow < 0)
                        {
     
                        } else
                        {
     
                        }
                });
     
     
     
    }
    Je suis bloqué à ce niveau. J'ai lu des tutoriels et on parle de TreeCellRenderer
    mais je ne sais pas comment ça marche.
    Si quelqu'un a une suggestion elle sera la bienvenue.
    d'avance merci!

  2. #2
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Les composants de Swing au contenu complexe (p. ex. JTree et JTable) utilisent le patron de conception "poids-plume" (flyweight) pour gérer leur contenu. Concrètement, plutôt que de contenir des composants enfants pour chaque cellule, ce qui peut être coûteux en espace mémoire dans le cas d'un JTree de grande taille par exemple , ils recyclent un même jeu de composants auxquels ils délèguent le rendu (et aussi l'édition) de chaque cellule. C'est via les méthodes setXxxRenderer (et setXxxEditor) qu'on peut personnaliser ces composants. Attention, même s'il s'agit de JComponent, ces derniers ne sont pas utilisés comme de "vrais" JComponent. C'est à dire qu'ils ne font pas partie du conteneur (en l'occurence le JTree, la JTable, etc.) mais sont simplement sollicités ponctuellement pour le rendu et l'édition de celules.

    Un petit exemple pour illustrer tout ça.

    Code Java : 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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JTree;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.TreeCellRenderer;
     
    public class Main {
     
        private static int selRow = -1;
     
    	/**
             * Ce délégué a juste pour tâche de fournir un composant pour le rendu de
             * chaque cellule. Dans notre exemple, si la cellule n'est pas avec sous
             * la souris, on retourne le composant de rendu du DefaultTreeCellRenderer.
             */
        private static class MyTreeCellRenderer extends JPanel implements TreeCellRenderer {
     
            private TreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
     
            public MyTreeCellRenderer() {
                JButton button = new JButton("clic1");
                setLayout(new BorderLayout());
                add(button);
            }
     
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
                if (row == selRow) {
                    return this;
                } else {
                    Component component = defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
                    return component;
                }
            }
        }
     
    	/**
             * Un TreeCellRenderer ne fait que du rendu et le bouton qu'il dessine n'est
             * pas interactif. On est donc obligé d'ajouter aussi un TreeCellEditor, même
             * si le contenu de la cellule n'est pas réellement modifié. Il s'agit plus
             * d'un effet de bord en fait.
             */
        private static class MyTreeCellEditor extends JPanel implements TreeCellEditor {
     
            private JButton button;
            private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
            private Object value;
     
            public MyTreeCellEditor() {
                button = new JButton("clic2");
                setLayout(new BorderLayout());
                add(button);
     
                button.addActionListener(new ActionListener() {
     
                    public void actionPerformed(final ActionEvent e) {
                        fireEditingStopped();
                    }
                });
            }
     
            public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
                this.value = node.getUserObject();
                return this;
            }
     
            public Object getCellEditorValue() {
                return value;
            }
     
            public boolean isCellEditable(EventObject anEvent) {
                return true;
            }
     
            public boolean shouldSelectCell(EventObject anEvent) {
                return false;
            }
     
            public boolean stopCellEditing() {
                fireEditingStopped();
                return true;
            }
     
            public void cancelCellEditing() {
                fireEditingCanceled();
            }
     
            public void addCellEditorListener(CellEditorListener l) {
                listeners.add(l);
            }
     
            public void removeCellEditorListener(CellEditorListener l) {
                listeners.remove(l);
            }
     
            private void fireEditingCanceled() {
                final ArrayList<CellEditorListener> copy =
                        new ArrayList<CellEditorListener>(listeners);
                for (final CellEditorListener ecouteur : copy) {
                    ecouteur.editingCanceled(new ChangeEvent(button));
                }
            }
     
            private void fireEditingStopped() {
                final ArrayList<CellEditorListener> copy =
                        new ArrayList<CellEditorListener>(listeners);
                for (final CellEditorListener ecouteur : copy) {
                    ecouteur.editingStopped(new ChangeEvent(button));
                }
            }
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
     
                public void run() {
                    final NewJFrame frame = new NewJFrame();
                    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                    frame.tree.setCellRenderer(new MyTreeCellRenderer());
                    frame.tree.setCellEditor(new MyTreeCellEditor());
                    frame.tree.addMouseMotionListener(new MouseMotionAdapter() {
     
                        @Override
                        public void mouseMoved(MouseEvent e) {
                            selRow = frame.tree.getRowForLocation(e.getX(), e.getY());
                            frame.tree.repaint();
                        }
                    });
                    frame.tree.setEditable(true);
                    frame.setVisible(true);
                }
            });
        }
    }

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    chantaga merci pour ta réponse cependant j'ai des erreurs dans la méthode main
    le compilateur ne retrouve pas NewJFrame
    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
    final NewJFrame frame = new NewJFrame();
                    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                    frame.tree.setCellRenderer(new MyTreeCellRenderer());
                    frame.tree.setCellEditor(new MyTreeCellEditor());
                    frame.tree.addMouseMotionListener(new MouseMotionAdapter() {
    
                        @Override
                        public void mouseMoved(MouseEvent e) {
                            selRow = frame.tree.getRowForLocation(e.getX(), e.getY());
                            frame.tree.repaint();
                        }
                    });
                    frame.tree.setEditable(true);
                    frame.setVisible(true);

  4. #4
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    La classe NewJFrame est juste celle de ma fenêtre de test qui contient un JTree. Il te suffit simplement de la remplacer par ta fenêtre.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    La classe NewJFrame est juste celle de ma fenêtre de test qui contient un JTree. Il te suffit simplement de la remplacer par ta fenêtre.
    je ne sais pas si c'est ma façon de faire qui n'est pas bonne mais j'ai toujours des erreurs.

    voici la classe de ma fenetre principale:
    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
     
    public class NewJFrame extends JFrame {
        //JTree tree = new JTree();
     
        public void NewJFrame(){
     
            this.setTitle("Ma première fenêtre java");
     
            this.setSize(400, 500);//definit la taille de la fenetre
     
            this.setLocationRelativeTo(null); //centre la fenere par rapport à l'ecrant
     
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ferme la fenetre 
        }
    }

  6. #6
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    C'est pourtant simple...

    Code Java : 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
     
    public class NewJFrame extends JFrame {
        JTree tree;
     
        public void NewJFrame(){
     
            this.setTitle("Ma première fenêtre java");
     
            this.setSize(400, 500);//definit la taille de la fenetre
     
            this.setLocationRelativeTo(null); //centre la fenere par rapport à l'ecrant
     
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ferme la fenetre 
     
            setLayout(new BorderLayout());
            tree = new JTree();
            add(tree);
     
            tree.setCellRenderer(...);
            tree.setCellEditor(...);
            tree.setEditable(true);
     
            setVisible(true);
        }
    }

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Je suis toujours planté

  8. #8
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Citation Envoyé par rolls Voir le message
    Je suis toujours planté
    Mais encore ?

  9. #9
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    Mais encore ?
    Désolé mais la classe NewFrame mecause toujours problème

    voici ce que je fait mais toujours rien
    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
     
     
    public class NewJFrame extends JFrame {
        JTree tree;
     
        public void NewJFrame(){
     
            this.setTitle("Ma première fenêtre java");
     
            this.setSize(400, 500);//definit la taille de la fenetre
     
            this.setLocationRelativeTo(null); //centre la fenere par rapport à l'ecrant
     
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ferme la fenetre
     
            setLayout(new BorderLayout());
            //hirarchie objets abstrait objets concret
            DefaultMutableTreeNode top = new DefaultMutableTreeNode("Root");
            DefaultMutableTreeNode ab1 = new DefaultMutableTreeNode("Noeud1");
            DefaultMutableTreeNode ab2 = new DefaultMutableTreeNode("Noeud2");        
     
            DefaultMutableTreeNode ab11 = new DefaultMutableTreeNode("Noeud11");
            DefaultMutableTreeNode ab12 = new DefaultMutableTreeNode("Noeud12");
            DefaultMutableTreeNode ab21 = new DefaultMutableTreeNode("Noeud21");    
     
            //hierarchie groupe objets concret
            ab1.add(ab11);ab1.add(ab12);
     
            ab2.add(ab21);
     
            top.add(ab1);
            top.add(ab2);
     
            JTree tree = new JTree(top);
     
            tree.getSelectionModel().setSelectionMode
                    (TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
     
            tree.setEditable(true);
            JScrollPane treeView = new JScrollPane(tree);
            this.add(treeView);
     
     
            setVisible(true);
        }
    }

  10. #10
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    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
     
    public class NewJFrame extends JFrame {
        JTree tree;
     
        public void NewJFrame(){ // 1
     
            // ...
     
            JTree tree = new JTree(top); // 2
     
            // ...
     
            setVisible(true); // 3
        }
    }
    1 - Ceci n'est pas un constructeur (enlève le void).
    2 - Cache la variable d'instance (enlève la déclaration en JTree).
    3 - Redondant (à enlever).

  11. #11
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    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
     
    public class NewJFrame extends JFrame {
        JTree tree;
     
        public void NewJFrame(){ // 1
     
            // ...
     
            JTree tree = new JTree(top); // 2
     
            // ...
     
            setVisible(true); // 3
        }
    }
    1 - Ceci n'est pas un constructeur (enlève le void).
    2 - Cache la variable d'instance (enlève la déclaration en JTree).
    3 - Redondant (à enlever).
    Merci énormément ça marche tu est
    Je constate que le bouton remplace le noeud quand le curseur se trouve dessus. est-il possible de le décaler vers la droite pour que le texte du noeud soit visible?

  12. #12
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    C'est le CellRenderer par défaut d'un JTree qui dessine les symboles ouverts/fermés en plus du libellé d'un noeud, or on l'a justement remplacé par une version qui ne dessine qu'un bouton... Il te reste donc du travail pour obtenir le résultat que tu vises.

  13. #13
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    C'est le CellRenderer par défaut d'un JTree qui dessine les symboles ouverts/fermés en plus du libellé d'un noeud, or on l'a justement remplacé par une version qui ne dessine qu'un bouton... Il te reste donc du travail pour obtenir le résultat que tu vises.
    tu veux dire que je doit réimplémenter le CellRenderer

  14. #14
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 310
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par rolls Voir le message
    tu veux dire que je doit réimplémenter le CellRenderer
    Excusez moi de relancer ce sujet.
    J'ai cherché mais je ne sais toujours pas comment je dois procéder pour réimplémenter le cellrender.
    En fait je veux faire apparaitre un arrière plan(lorsque la souris se trouve sur un noeud de l'arbre) un Panel comportant un bouton (voire plusieur)pour associer un noeud fils à ce dernier.
    d'avance merci

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/04/2010, 16h17
  2. ajouter des répertoires (noeuds) dans un arbre ?
    Par blueLight dans le forum Composants
    Réponses: 0
    Dernier message: 31/08/2009, 11h54
  3. edition ou modification des noeuds d'une arbre JTREE
    Par foufoulina2007 dans le forum Composants
    Réponses: 1
    Dernier message: 30/11/2007, 21h52
  4. Réponses: 2
    Dernier message: 30/10/2007, 17h10
  5. TreeView -> ajouter un child à un noeud donné
    Par fake dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/03/2003, 17h14

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