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 :

[JComboBox] actionListener ou itemListener ?


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut [JComboBox] actionListener ou itemListener ?
    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) :
    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();
    			}
    		}
    	}
    }
    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 )

    Merci d'avance à tous ceux qui pourront m'aider

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 43
    Par défaut
    Salut
    Je ne suis pas sur a 100%, j'enléverai donc ce message si ce n'est pas bon. Mais il me semble que le ItemListener est appelé pour une selection et une dessélection.
    La méthode 'public int getStateChange()' du ItemEvent permetrait de savoir si c'est une sélection ou une dessélection.
    Dis moi quoi.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Fort possible, car je viens de lire "ItemListener est la plupart du temps appelé quand un élément est sélectionné dans un JComboBox"

    Le fait qu'il est appelé deux fois voudrait donc dire lors de la déselection de l'item sélectionné par défaut et lors de la sélection d'un autre item

    Mais donc comment faire pour qu'il ne s'exécute que lors d'un sélection ? (si c'est possible, ou sinon comment remédier à mon problème) car les actionListener génèrent l'erreur donnée dans mon permier post (ça marche mais sauf quand je veux changer ma sélection de chapitre / sous-chapitre / sous-sous-chapitre)

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Si cela peut aider quelqu'un à comprendre :

    J'ai réessayé avec le actionListener (exactement le même code que pour le itemListener) et j'ai ajouté tout à la fin du actionPerformed cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(seeArticle.getArticleComponents().getSelectedItem());
    Pour afficher le texte de l'item que je sélectionne.

    Lorsque je sélectionne le titre d'un chapitre, puis que je sélectionne l'un des trois autres items (je suis dans la première combobox, celle de mon exemple du premier post) la console me retourne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a
    [Ljava.lang.Object;@76e369
    [Ljava.lang.Object;@14c194d
    Keywords
    "a" est le titre que j'avais donné à mon chapitre, et Keywords est l'item à sélectionner pour modifier les mots clés de l'article

    Il y a donc deux autres valeurs affichées et je ne sais pas d'où elles viennent.
    Je ne sais pas si cela a une importance mais je vous le met quand même

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Bonjour,

    comme te l'as dit "amithral", utilise la méthode getStateChange() pour récupérer le type d'événement.
    Tu testes si c'est une sélection et dans ce cas tu fais ce que t'as à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void itemStateChanged(ItemEvent arg0) {
       if (arg0.getStateChange == ItemEvent.SELECTED ) {
                //ton code qui ne sera éxécuter seulement lors de la sélection dans ta combo
         }
    }
    Cdlt

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Ah oui effectivement. Ba c'est bien ca, ca marche.

    Merci à vous deux

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

Discussions similaires

  1. Comment mettre un ActionListener sur une Jcombobox
    Par maitrejediyass dans le forum Composants
    Réponses: 1
    Dernier message: 02/01/2011, 13h37
  2. JCombobox + ItemListener
    Par kimausoleil dans le forum Composants
    Réponses: 3
    Dernier message: 16/03/2010, 17h53
  3. Réponses: 11
    Dernier message: 07/09/2007, 15h11
  4. Réponses: 3
    Dernier message: 25/04/2007, 09h47
  5. Réponses: 7
    Dernier message: 17/04/2007, 13h51

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