Bonjour,
Je suis sur une appli de rédaction d'articles.
J'ai implémenté dans la semaine la possibilité de modifier les chapitres / sous-chapitres / sous-sous-chapitres déjà enregistrés et ce avec des jComboBox
Voici comment j'ai procédé :
une frame contenant une combobox avec a l'intérieur :
possibilité de modifier le titre de l'article
possibilité de modifier les mots clés de l'article
possibilité de modifier le nom de l'auteur de l'article
le titre du premier chapitre enregistré
le titre du deuxième chapitre enregistré
etc etc
Je voulais que lorsqu'on sélectionne le titre d'un chapitre, une 2e combobox apparaisse avec dedans :
possibilité de modifier le titre du chapitre
le titre du premier sous-chapitre enregistré dans ce chapitre
le titre du deuxième sous-chapitre enregistré dans ce chapitre
etc etc
Même chose pour les sous chapitres et sous sous chapitres
J'avais fait cela sans problème avec des actionListeners sur mes combobox mais j'avais un problème : Admettons que la fenêtre vienne seulement de s'ouvrir, je sélectionne un chapitre dans la 1ere combobox, et si je veux changer ma sélection, erreur de type :
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 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -3 at java.util.ArrayList.get(Unknown Source) at com.labosun.articlewriter.itemListeners.ModifChapterAction.itemStateChanged(ModifChapterAction.java:49) at javax.swing.JComboBox.fireItemStateChanged(Unknown Source) at javax.swing.JComboBox.selectedItemChanged(Unknown Source) at javax.swing.JComboBox.contentsChanged(Unknown Source) at javax.swing.JComboBox.intervalRemoved(Unknown Source) at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source) at javax.swing.DefaultComboBoxModel.removeAllElements(Unknown Source) at javax.swing.JComboBox.removeAllItems(Unknown Source) at com.labosun.articlewriter.actionListeners.SelectModifArticleAction.actionPerformed(SelectModifArticleAction.java:84) at javax.swing.JComboBox.fireActionEvent(Unknown Source) at javax.swing.JComboBox.setSelectedItem(Unknown Source) at javax.swing.JComboBox.setSelectedIndex(Unknown Source) at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source) at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
J'ai donc essayé de faire la même chose avec des itemListener, mais cette fois, le problème c'est que cet itemListener est appelé 2fois ... (j'ai effectué un simple test d'affichage dans la console pour savoir ça)
Je pense que cela vient du fait que je clique 2fois sur la combobox (une fois pour la dérouler, une autre pour sélectionner l'item qui m'intéresse) mais je ne vois pas comment limiter l'appel ) une seule fois.
Auriez vous une idée par hazard ?
Pour le cas ou ça peut en aider certains, voici le code que je souhaite effectuer lors d'une action sur la première combobox (code de l'itemListener) :
Voila, si vous voulez d'autre code n'hesitez pas, tant que mon problème est résolu ya pas de soucis (je suis dessus depuis hier
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
110
111
112
113
114
115
116 package com.labosun.articlewriter.itemListeners; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import com.labosun.articlewriter.bo.Chapter; import com.labosun.articlewriter.bo.ChapterContent; import com.labosun.articlewriter.bo.SubChapter; import com.labosun.articlewriter.form.SeeArticle; import com.labosun.articlewriter.form.Writer; public class ModifArticleAction implements ItemListener { /** * to get the active instance of the modifier */ private SeeArticle seeArticle; /** * to get the active instance of writer */ private Writer writer; /** * instanciate a new listener (getting the active instances of the modifier and writer) * @param sa * @param wtr */ public ModifArticleAction(SeeArticle sa, Writer wtr) { this.seeArticle = sa; this.writer = wtr; } public void itemStateChanged(ItemEvent arg0) { //test d'affichage System.out.println(seeArticle.getArticleComponents().getSelectedItem()+" "+seeArticle.getArticleComponents().getSelectedIndex()); //si on ne sélectionne pas l'item avec ce texte if (!seeArticle.getArticleComponents().getSelectedItem().equals("Article's infos and chapters : ")) { //si on selectionne l'item "titre" if (seeArticle.getArticleComponents().getSelectedItem().equals("Title")) { //on définit l'état de la modif (je me sers de cette variable pour savoir comment modifier ailleurs) seeArticle.state = "modifArticle.title"; //on retire tout dans le panel seeArticle.getJContentPane().removeAll(); //on afficle un label et un champ de saisie seeArticle.getJContentPane().add(seeArticle.getTitleLabel()); seeArticle.getJContentPane().add(seeArticle.getTitleField()); //on affiche le bouton pour valider la modif seeArticle.getJContentPane().add(seeArticle.getModifButton()); //on redessine pour faire propre seeArticle.getJContentPane().repaint(); //on donne au champ la valeur du titre de l'article seeArticle.getTitleField().setText(writer.article.getTitle()); } //sinon si on choisit l'item "Keywords" on fait la même chose mais sur les keywords else if (seeArticle.getArticleComponents().getSelectedItem().equals("Keywords")) { seeArticle.state = "modifArticle.keywords"; seeArticle.getJContentPane().removeAll(); seeArticle.getJContentPane().add(seeArticle.getTitleLabel()); seeArticle.getTitleLabel().setText("Modify the article's keywords : "); seeArticle.getTitleLabel().setBounds(seeArticle.getSize().width/2-seeArticle.getTitleLabel().getPreferredSize().width/2, 60, seeArticle.getTitleLabel().getPreferredSize().width, seeArticle.getTitleLabel().getPreferredSize().height); seeArticle.getJContentPane().add(seeArticle.getTitleField()); seeArticle.getTitleField().setText(writer.article.getKeywords()); seeArticle.getJContentPane().add(seeArticle.getModifButton()); seeArticle.getJContentPane().repaint(); } //idem si on sélectionne l'item "author" else if (seeArticle.getArticleComponents().getSelectedItem().equals("Author")) { seeArticle.state = "modifArticle.author"; seeArticle.getJContentPane().removeAll(); seeArticle.getJContentPane().add(seeArticle.getTitleLabel()); seeArticle.getTitleLabel().setText("Modify the article's author : "); seeArticle.getTitleLabel().setBounds(seeArticle.getSize().width/2-seeArticle.getTitleLabel().getPreferredSize().width/2, 60, seeArticle.getTitleLabel().getPreferredSize().width, seeArticle.getTitleLabel().getPreferredSize().height); seeArticle.getJContentPane().add(seeArticle.getTitleField()); seeArticle.getTitleField().setText(writer.article.getAuthor()); seeArticle.getJContentPane().add(seeArticle.getModifButton()); seeArticle.getJContentPane().repaint(); } //sinon c'est qu'on sélectionne le titre d'un chapitre else { //on ajoute donc au panel la liste du contenu de chapitres seeArticle.getJContentPane().add(seeArticle.getChapterComponents()); //on crée une nouvelle instance de chapter seeArticle.chapter = new Chapter(); //on récupère le chapitre souhaité dans la liste des chapitres (dans le get, on fait -4 car il y a 4 items avant le 1er titre) seeArticle.chapter = (Chapter)writer.article.getContent().get(seeArticle.getArticleComponents().getSelectedIndex()-4); //on vide la liste du contenu de chapitres seeArticle.getChapterComponents().removeAllItems(); //on ajoute un 1er item pour dire quelle est la liste seeArticle.getChapterComponents().addItem("Chapters info and subChapters : "); //on ajoute un item pour pouvoir modifier le titre du chapitre seeArticle.getChapterComponents().addItem("Title"); //si la liste de composants du chapitre sélectionné a quelque chose en elle if (seeArticle.chapter.getContent().size() != 0) { //pourchacun de ces composants, on ajoute son titre à la liste d'items des composants du chapitre (il y a forcément un titre car les composants sont tous des sous-chapitres) for (ChapterContent subChapter : seeArticle.chapter.getContent()) { seeArticle.getChapterComponents().addItem(((SubChapter)subChapter).getTitle()); } } //on redessine le tout seeArticle.getJContentPane().repaint(); } } } })
Merci d'avance à tous ceux qui pourront m'aider
Partager