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 :

[Insertion]Probleme lors de l'insertion d'un node dans un TreeModel customisé


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Novembre 2004
    Messages : 129
    Par défaut [Insertion]Probleme lors de l'insertion d'un node dans un TreeModel customisé
    Bonjour,

    J'ai un petit problème pour gérer les modifications d'un JTree dynamique.

    Donc, déjà, présentation de mon modèle de données, assez simplifié.
    Je dispose d'une liste de questions (classe Question). La classe Question dispose d'une description ainsi qu'une d'une liste d'hypothèses, sous forme de liste de String.
    Je présente cette liste de questions sous forme d'un arbre, avec la racine contenant les questions, elles-même contenant les hypothèses. Jusque là, rien de compliquée.

    J'ai donc crée une classe QuestionTreeModel qui implémente l'interface TreeModel. J'ai choisi cette solution pour éviter d'avoir une couche supplémentaire.
    La racine de mon arbre est la liste des questions.
    Je vous présente le code tout de suite

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.tree.TreeModel;
    import javax.swing.tree.TreePath;
     
     
    public class QuestionsTreeModel implements TreeModel {
     
        private List<TreeModelListener> treeModelListeners = new ArrayList<TreeModelListener>();
     
        private List<Question> questions = new ArrayList<Question>();
     
        public QuestionsTreeModel() {
            questions.add(e);
        }
        @Override
        public void addTreeModelListener(TreeModelListener l) {
            treeModelListeners.add(l);
        }
     
        @Override
        public Object getChild(Object parent, int index) {
            if (parent == getRoot()) {
                return questions.get(index);
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().get(index);
            } else {
                return null;
            }
        }
     
        @Override
        public int getChildCount(Object parent) {
            if (parent == getRoot()) {
                return questions.size();
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().size();
            } else if (parent instanceof String) {
                return 0;
            } else {
                return -1;
            }
        }
     
        @Override
        public int getIndexOfChild(Object parent, Object child) {
            if (parent == getRoot()) {
                return questions.indexOf(child);
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().indexOf(child);
            }
            return -1;
        }
     
        @Override
        public Object getRoot() {
            if (questions.size() == 0) {
                return null;
            }
            return questions;
        }
     
        @Override
        public boolean isLeaf(Object node) {
     
            return node instanceof String;
        }
     
        @Override
        public void removeTreeModelListener(TreeModelListener l) {
            treeModelListeners.remove(l);
        }
     
        @Override
        public void valueForPathChanged(TreePath path, Object newValue) {
     
        }
     
        private void treeNodesInserted(TreeModelEvent treeModelEvent) {
            for (TreeModelListener listener : treeModelListeners) {
                listener.treeNodesInserted(treeModelEvent);
            }
        }
     
        public void addNewQuestion(Question newQuestion) {
            questions.add(newQuestion);
            TreeModelEvent treeModelEvent = new TreeModelEvent(this,
                    new Object[] { getRoot() }, new int[] { questions.size() - 1 },
                    new Object[] { newQuestion });
            treeNodesInserted(treeModelEvent);
        }
    }
    Lorsque je fais appel a ma dernière méthode (addNewQuestion), rien ne se passe, et si j'essaye de cliquer a nouveau sur le JTree, une exception sort.

    J'avoue ne pas trop savoir ou j'ai merdé, mais je pense que c'est lors de la création de l'event. Quelqu'un pourrait-il m'aider ?

    Cordialement,
    Teocali

    P.S. : Je colle ci-après le code source de la classe Question, ainsi que celui-de la frame que j'utilise pour tester ça.

    La classe Question :
    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
     
     
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Question {
     
        private String description;
     
        public Question(String description) {
             this.description = description;
        }
     
        public String getDescription() {
            return description;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
     
        private List<String> hypotheses = new ArrayList<String>();
     
        public List<String> getHypotheses() {
            return hypotheses;
        }
     
        @Override
        public String toString() {
            return description;
        }
    }
    Et la Frame de test
    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
    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
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTree;
     
     
     
    public class TestMyFrame extends JFrame {
     
        private static final long serialVersionUID = 1L;
        private JPanel jContentPane = null;
        private JButton addButton = null;
        private JTree questionsTree = null;
        private QuestionsTreeModel questionsTreeModel = null;  //  @jve:decl-index=0:visual-constraint="498,375"
     
        /**
         * This is the default constructor
         */
        public TestMyFrame() {
            super();
            initialize();
        }
     
        /**
         * This method initializes this
         */
        private void initialize() {
            this.setSize(521, 307);
            this.setContentPane(getJContentPane());
            this.setTitle("JFrame");
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
     
        /**
         * This method initializes jContentPane
         * 
         * @return javax.swing.JPanel
         */
        private JPanel getJContentPane() {
            if (jContentPane == null) {
                jContentPane = new JPanel();
                jContentPane.setLayout(new BorderLayout());
                jContentPane.add(getAddButton(), BorderLayout.NORTH);
                jContentPane.add(getQuestionsTree(), BorderLayout.CENTER);
            }
            return jContentPane;
        }
     
     
     
        /**
         * This method initializes addButton
         * 
         * @return javax.swing.JButton
         */
        private JButton getAddButton() {
            if (addButton == null) {
                addButton = new JButton();
                addButton.setText("Test");
                addButton.addActionListener(new ActionListener() {
     
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        getQuestionsTreeModel().addNewQuestion(new Question("Test"));
     
                    }
     
                });
            }
            return addButton;
        }
     
     
     
        /**
         * This method initializes questionsTree    
         *     
         * @return javax.swing.JTree    
         */
        private JTree getQuestionsTree() {
            if (questionsTree == null) {
                questionsTree = new JTree();
                questionsTree.setModel(getQuestionsTreeModel());
            }
            return questionsTree;
        }
     
        /**
         * This method initializes questionsTreeModel    
         *     
         * @return QuestionsTreeModel    
         */
        private QuestionsTreeModel getQuestionsTreeModel() {
            if (questionsTreeModel == null) {
                questionsTreeModel = new QuestionsTreeModel();
            }
            return questionsTreeModel;
        }
     
        public static void main(String[] args) {
            new TestMyFrame().setVisible(true);
        }
     
     
    } // @jve:decl-index=0:visual-constraint="10,10"

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Essaie ceci:
    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
    85
    86
    87
    88
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.MutableTreeNode;
    import javax.swing.tree.TreePath;
     
    public class TestMyFrame extends JFrame {
    ...
        private int count;
    ...
        private JPanel getJContentPane() {
            if (jContentPane == null) {
                jContentPane = new JPanel();
                jContentPane.setLayout(new BorderLayout());
                jContentPane.add(getAddButton(), BorderLayout.NORTH);
                jContentPane.add(new JScrollPane(getQuestionsTree()), BorderLayout.CENTER);
            }
            return jContentPane;
        }
        private JButton getAddButton() {
            if (addButton == null) {
                addButton = new JButton();
                addButton.setText("Test");
                addButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        count++;
                        Question question = new Question("Question " + count);
                        List<String> hypotheses = new ArrayList<String>();
                        hypotheses.add("Hypothese " + count + "a");
                        hypotheses.add("Hypothese " + count + "b");
                        hypotheses.add("Hypothese " + count + "c");
                        question.setHypotheses(hypotheses);
                        getQuestionsTreeModel().addNewQuestion(question);
                        getQuestionsTree().expandRow(0);
                    }
                });
            }
            return addButton;
        }
        private JTree getQuestionsTree() {
            if (questionsTree == null) {
                questionsTree = new JTree();
                questionsTree.setModel(getQuestionsTreeModel());
                questionsTree.addTreeSelectionListener(new TreeSelectionListener() {
                    public void valueChanged(TreeSelectionEvent e) {
                        TreePath path = e.getPath();
                        Question question = (Question) (DefaultMutableTreeNode)
                                path.getLastPathComponent();
                        String description = question.getDescription();
                        System.out.println("description = " + description);
                        List<String> hypotheses = question.getHypotheses();
                        System.out.println("hypotheses = " + hypotheses);
                    }
                });
            }
            return questionsTree;
        }
    ...
    }
    class Question extends DefaultMutableTreeNode{
    ...
        public void setHypotheses(List<String> hypotheses) {
            this.hypotheses = hypotheses;
        }
    }
    class QuestionsTreeModel extends DefaultTreeModel {
        public QuestionsTreeModel() {
            super(null);
            setRoot(new DefaultMutableTreeNode("Questions"));
        }
        public void addNewQuestion(Question question) {
            insertNodeInto(question, (MutableTreeNode) root, root.getChildCount());
        }
    }

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Novembre 2004
    Messages : 129
    Par défaut
    Merci uhrand, mais j'aimerais bien garder ma classe QuestionTreeModel comme implémentation directe de TreeModel, et non comme héritière de DefaultTreeModel. Là, ce que tu me proposes, c'est un contournement du problème. Or, ça ne me convient pas, pour diverses raisons que je n'ai pas explicités ici car elles n'ont pas grand chose a voir avec le sujet. Là, j'aimerais bien savoir pourquoi mon code ne marche pas. Je ne vois rien qui fait que ça bloque...
    Mais merci encore.

    Teocali

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Novembre 2004
    Messages : 129
    Par défaut
    Bon, en farfouillant et en testant, j'ai trouvé le probleme.

    En fait, ça vient d'utiliser une instance de List comme root qui pose probleme. En utilisant une instance final d'Object comme root, instance non modifiée par l'ajout de node, donc, ça marche beaucoup mieux.
    Je vous colle le code du QuestionTreeModel modifié.

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.tree.TreeModel;
    import javax.swing.tree.TreePath;
     
     
    public class QuestionsTreeModel implements TreeModel {
     
        private List<TreeModelListener> treeModelListeners = new ArrayList<TreeModelListener>();
     
        private List<Question> questions = new ArrayList<Question>();
     
        final private Object root = new Object();
     
        @Override
        public void addTreeModelListener(TreeModelListener l) {
            treeModelListeners.add(l);
        }
     
        @Override
        public Object getChild(Object parent, int index) {
            if (parent == getRoot()) {
                return questions.get(index);
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().get(index);
            } else {
                return null;
            }
        }
     
        @Override
        public int getChildCount(Object parent) {
            if (parent == getRoot()) {
                return questions.size();
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().size();
            } else if (parent instanceof String) {
                return 0;
            } else {
                return -1;
            }
        }
     
        @Override
        public int getIndexOfChild(Object parent, Object child) {
            if (parent == getRoot()) {
                return questions.indexOf(child);
            } else if (parent instanceof Question) {
                Question researchQuestion = (Question) parent;
                return researchQuestion.getHypotheses().indexOf(child);
            }
            return -1;
        }
     
        @Override
        public Object getRoot() {
            return root;
        }
     
        @Override
        public boolean isLeaf(Object node) {
            return node instanceof String;
        }
     
        @Override
        public void removeTreeModelListener(TreeModelListener l) {
            treeModelListeners.remove(l);
        }
     
        @Override
        public void valueForPathChanged(TreePath path, Object newValue) {
     
        }
     
        private void treeNodesInserted(TreeModelEvent treeModelEvent) {
            for (TreeModelListener listener : treeModelListeners) {
                listener.treeNodesInserted(treeModelEvent);
            }
        }
     
        public void addNewQuestion(Question newQuestion) {
            questions.add(newQuestion);
            TreeModelEvent treeModelEvent = new TreeModelEvent(this,
                    new Object[] { getRoot() }, new int[] { questions.size() - 1},
                    new Object[] { newQuestion });
            treeNodesInserted(treeModelEvent);
        }
    }
    Cordialement,
    Teocali

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/09/2011, 08h02
  2. [MySQL] problemes lors de l'insertion de données
    Par otari dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/06/2007, 17h55
  3. [XML] Probleme lors de l'insertion des données XML
    Par Lyna2007 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/03/2007, 16h26
  4. [C#] Problème de Date lors d'un Insert
    Par BilTCD dans le forum ASP.NET
    Réponses: 5
    Dernier message: 22/08/2005, 16h02
  5. [SYBASE] probleme lors d'un insert
    Par arioule dans le forum Sybase
    Réponses: 1
    Dernier message: 25/02/2005, 11h11

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