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

Agents de placement/Fenêtres Java Discussion :

[JComboBox] Problème dans le PopMenu après ajout


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 73
    Points : 78
    Points
    78
    Par défaut [JComboBox] Problème dans le PopMenu après ajout
    Bonjour,

    J'ai un problème avec un JComboBox.
    Enfin plus précisément avec une classe qui hérite un JComboBox.
    J'ai fait ce petit exemple source pour essayer de condenser mon problème.
    En fait au départ, la taille (getSize) du modèle du JComboBox vaut une certaine valeur.
    Si j'augmente cette taille et que j'essaye de faire apparaitre le PopMenu, il est vide.
    Si je rediminue cette taille, mon PopMenu apparait normalement...
    Là, franchement, je bloque...

    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
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import java.util.Vector;
     
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
     
    /**
     * Classe Exemple
     */
    public class Exemple extends JFrame implements ActionListener {
    	private MonCombo monCombo;
    	private JButton boutonAjouter = new JButton("Ajouter");
    	private JButton boutonSoustraire = new JButton("Supprimer");
     
    	/**
             * Classe MonCombo
             */
    	private class MonCombo extends JComboBox {
    		private MonModele modele=new MonModele();
     
    		/**
                     * Classe MonModele
                     */
    		private class MonModele extends DefaultComboBoxModel {
    			private Vector tableauxInterne = new Vector();
     
    			public MonModele() {
    				Random rnd = new Random();
    				tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    				tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    			}
     
    			public Object getElementAt(int index) {
    				return tableauxInterne.elementAt(index);
    			}
     
    			public int getSize() {
    				return tableauxInterne.size();
    			}
     
    		}
     
    		private MonCombo() {
    			super();
    			setModel(modele);
    			if (getItemCount() > 0) {
    				setSelectedIndex(0);
    			}
    		}
     
    	}
     
    	private Exemple() {
    		super("Exemple");
     
    		monCombo = new MonCombo();
     
    		boutonAjouter.addActionListener(this);
    		boutonSoustraire.addActionListener(this);
     
    		Container conteneur = getContentPane();
    		conteneur.setLayout(new GridBagLayout());
    		GridBagConstraints contrainte = new GridBagConstraints();
    		contrainte.weightx = 1;
    		contrainte.fill = GridBagConstraints.HORIZONTAL;
    		conteneur.add(monCombo, contrainte);
    		contrainte.gridy = 1;
    		conteneur.add(boutonAjouter, contrainte);
    		contrainte.gridy = 2;
    		conteneur.add(boutonSoustraire, contrainte);
     
    		pack();
    		setVisible(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		int index = monCombo.getSelectedIndex();
    		if (e.getSource() == boutonSoustraire) {
    			Random rnd = new Random();
    			int pos=rnd.nextInt(monCombo.modele.tableauxInterne.size());
    			monCombo.modele.tableauxInterne.removeElementAt(pos);
    		} 
    		else {
    			if (e.getSource() == boutonAjouter) {
    				Random rnd = new Random();
    				monCombo.modele.tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    			}
    		}
    	}
     
    	public static void main(String args[]) {
    		new Exemple();
    	}
    }
    Merci,
    Cordialement,
    PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 73
    Points : 78
    Points
    78
    Par défaut
    Personne n'a une idée ????
    Parce que moi je nage dans le brouillard !!!
    PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 73
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Alors j'ai fini par trouver je pense la solution...

    Explication simple :
    Lorsque l'on modifie la taille de la liste des valeurs retourné par le modèle,
    il faut lancer la méthode fireContentsChanged(this, 0, 0); de DefaultComboBoxModel.
    Cette méthode est protégée. Donc, elle ne peux être appeler que depuis la classe qui hérite.

    Explication plus complexe :
    La méthode fireContentsChanged(this, 0, 0); déclenche la fonction contentsChanged des ListDataListener du modèle.
    Parmi ces ListDataListener, on trouve un objet Handler de BasicListUI (Super-classe de MetalComboBoxUI qui est l'UI de JComboBox).
    Lorsque la méthode contentsChanged de cet objet Handler est appelée,
    la variable updateLayoutStateNeeded de la classe BasicListUI est modifié.

    Ainsi, lorsque le PopMenu est rendu visible, il est dessiné en passant par
    la méthode void paint(Graphics g, JComponent c) de la classe BasicListUI.
    Et au début de cette méthode, on trouve un appel à maybeUpdateLayoutState();
    Et cette méthode appelle updateLayoutState(); lorsque updateLayoutStateNeeded
    est différent de 0 (c'est la variable de classe, modifié au dessus).
    La méthode updateLayoutState(); remet à jour le tableau cellHeights (variable de classe).

    Et c'était ce tableau non remis en jour qui posait problème.
    Parce que lors du dessin, si la taille de ce tableau est différente de celle
    des éléments du modèle du JComboBox (getSize()), l'affichage des items
    n'est pas réalisé.

    Voilà,

    Code qui marche :
    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
     
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import java.util.Vector;
     
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
     
    /**
     * Classe Exemple
     */
    public class Exemple extends JFrame implements ActionListener {
    	private MonCombo monCombo;
     
    	private JButton boutonAjouter = new JButton("Ajouter");
     
    	private JButton boutonSoustraire = new JButton("Supprimer");
     
    	/**
             * Classe MonCombo
             */
    	private class MonCombo extends JComboBox {
    		private MonModele modele = new MonModele();
     
    		/**
                     * Classe MonModele
                     */
    		private class MonModele extends DefaultComboBoxModel {
    			private Vector<Integer> tableauxInterne = new Vector<Integer>();
     
    			public MonModele() {
    				Random rnd = new Random();
    				tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    				tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    			}
     
    			public Object getElementAt(int index) {
    				return tableauxInterne.elementAt(index);
    			}
     
    			public int getSize() {
    				return tableauxInterne.size();
    			}
     
    			public void refresh() {
    				fireContentsChanged(this, 0, 0);
    			}
    		}
     
    		private MonCombo() {
    			super();
    			setModel(modele);
    			if (getItemCount() > 0) {
    				setSelectedIndex(0);
    			}
    		}
     
    		public void refresh() {
    			modele.refresh();
    		}
    	}
     
    	private Exemple() {
    		super("Exemple");
     
    		monCombo = new MonCombo();
     
    		boutonAjouter.addActionListener(this);
    		boutonSoustraire.addActionListener(this);
     
    		Container conteneur = getContentPane();
    		conteneur.setLayout(new GridBagLayout());
    		GridBagConstraints contrainte = new GridBagConstraints();
    		contrainte.weightx = 1;
    		contrainte.fill = GridBagConstraints.HORIZONTAL;
    		conteneur.add(monCombo, contrainte);
    		contrainte.gridy = 1;
    		conteneur.add(boutonAjouter, contrainte);
    		contrainte.gridy = 2;
    		conteneur.add(boutonSoustraire, contrainte);
     
    		pack();
    		setVisible(true);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		int index = monCombo.getSelectedIndex();
    		if (e.getSource() == boutonSoustraire) {
    			Random rnd = new Random();
    			int pos = rnd.nextInt(monCombo.modele.tableauxInterne.size());
    			monCombo.modele.tableauxInterne.removeElementAt(pos);
    		} else {
    			if (e.getSource() == boutonAjouter) {
    				Random rnd = new Random();
    				monCombo.modele.tableauxInterne.addElement(new Integer(rnd.nextInt(10)));
    			}
    		}
    		monCombo.refresh();
    	}
     
    	public static void main(String args[]) {
    		new Exemple();
    	}
    }
    Cordialement,
    PS : N'oublie pas le tag [Résolu] (en cliquant sur http://pouiller.eclipse.free.fr/avatar/resolu.gif), si ton problème est résolu...

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

Discussions similaires

  1. [XL-2007] Problème dans une macro pour ajouter une date
    Par INFINITY100 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/05/2015, 20h28
  2. [2008R2] Problème replication de fusion apres ajout de tables
    Par zrapeko dans le forum Réplications
    Réponses: 1
    Dernier message: 12/09/2014, 19h57
  3. [XL-2007] Problème de copier/coller aprés ajout d'une macro.
    Par crevette06220 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/08/2011, 22h29
  4. Réponses: 4
    Dernier message: 13/04/2011, 18h22
  5. Réponses: 3
    Dernier message: 16/08/2006, 17h32

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