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
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.
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); } }
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 :
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 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; } }
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"
Partager