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]Rafraichissement apres modification modèle


Sujet :

Composants 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]Rafraichissement apres modification modèle
    Bonjour,

    Je cherche la méthode qui me permettrait de raffraichir
    l'affichage d'un JComboBox après avoir modifier les valeurs internes
    à son modèle...
    En fait le code ci-dessous, est un exemple de ce que je veux faire.
    Dans la vrai version (beaucoup plus de code donc difficile a recopier ici),
    dans une partie de mon ecran, je modifie une base de données.
    Cette base de données est consultée par le modèle du JComboBox
    pour connaitre les valeurs à afficher.
    Je veux donc indiquer au JComboBox de raffraichir son affichage, une fois
    que j'ai modifié les valeurs de la base de données.

    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
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    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=new MonCombo();
    	private JButton boutonAjouter=new JButton("Ajouter 1");
    	private JButton boutonSoustraire=new JButton("Soustraire 1");
     
    	/**
             * Classe MonCombo
             */
    	private class MonCombo extends JComboBox{
     
    		/**
                     * Classe MonModele
                     */
    		private class MonModele extends DefaultComboBoxModel{
    			private Integer tableaux[]={
    					new Integer(1),new Integer(10),new Integer(100)
    				};
     
    			public Object getElementAt(int index) {
    				return tableaux[index];
    			}
     
    			public int getSize() {
    				return tableaux.length;
    			}
     
    		}
     
    		private MonCombo(){
    			super();
    			setModel(new MonModele());
    			if(getItemCount()>0){
    				setSelectedIndex(0);
    			}
    		}
     
    		// Je cherche un meilleur moyen de raffraichir ma comboBox
    		// que l'utilisation de ces deux setSelectedIndex
    		public void refresh(int index){
    			setSelectedIndex(-1);
    			setSelectedIndex(index);
    		}
    	}
     
    	private Exemple(){
    		super("Exemple");
     
    		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();
    		MonCombo.MonModele monmodele=((MonCombo.MonModele)monCombo.getModel());
    		Integer tableaux[]=monmodele.tableaux;
    		if(e.getSource()==boutonSoustraire){
    			for(int i=0;i<tableaux.length;i++){
    				tableaux[i]=new Integer(tableaux[i].intValue()-1);
    			}
    		}
    		else{
    			if(e.getSource()==boutonAjouter){
    				for(int i=0;i<tableaux.length;i++){
    					tableaux[i]=new Integer(tableaux[i].intValue()+1);
    				}
    			}
    		}
    		monCombo.refresh(index);
    	}
     
    	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 habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Essaie la methode revalidate() sur ta JComboBox.
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  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
    Citation Envoyé par la7su
    Essaie la methode revalidate() sur ta JComboBox.
    Ca ne fonctionne pas...
    Je pense qu'il redessine bien la JComboBox mais qu'il ne se rend pas compte
    que les valeurs du modèle ont changé...
    Mais je fais peut-etre fausse route...

    Merci pour la suggestion...
    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...

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    En fait la methode revalidate met bien a jour les valeurs de JComboBox, c'est la valeur courante qui n'est pas remise a jour.
    A moins de me tromper, je crois que tu es oblige de faire un setSelectedIndex pour rafraichir la valeur courante de ta JComboBox. (pas besoin du setSelectedIndex(-1)).
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  5. #5
    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
    Exact...
    Ca fonctionne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		public void refresh(int index){
    			setSelectedIndex(index);
    			revalidate();
    		}
    Mais je viens de comprendre que le problème est sans doute
    plus complexe que celà...

    Merci pour les informations....
    Je tournais complétement en rond...
    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...

  6. #6
    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
    En fait je me suis rendu compte que mon probleme etait plus complexe..
    Parce qu'en fait je ne modifie pas vraiment les valeurs du modele
    Mais plutot les valeurs que le renderer utilise
    Donc le 'setSelectedIndex(index);' en fonctionne pas parce
    que les valeurs du modèle n'ont pas changé...
    Voir le code ci-dessous (que je voulais concis mais qui s'etoffe...)

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.DefaultListCellRenderer;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JList;
     
     
    /**
     * Classe Exemple
     */
    public class Exemple extends JFrame implements ActionListener {
    	private MonCombo monCombo;
    	private JButton boutonAjouter=new JButton("Ajouter 1");
    	private JButton boutonSoustraire=new JButton("Soustraire 1");
     
    	private Integer tableauxExterne[]={
    			new Integer(1),new Integer(10),new Integer(100)
    		};
     
    	/**
             * Classe MonCombo
             */
    	private class MonCombo extends JComboBox{
     
    		/**
                     * Classe MonModele
                     */
    		private class MonModele extends DefaultComboBoxModel{
    			private Integer tableauxInterne[]={
    					new Integer(1),new Integer(0),new Integer(2)
    				};
     
    			public Object getElementAt(int index) {
    				return tableauxInterne[index];
    			}
     
    			public int getSize() {
    				return tableauxInterne.length;
    			}
     
    		}
     
    		/**
                     * Classe MonRenderer
                     */
    		private class MonRenderer extends DefaultListCellRenderer{
    			private Integer tableauxExterne[];
     
    			public MonRenderer(Integer tableauxExterne[]){
    				this.tableauxExterne=tableauxExterne;
    			}
     
    			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    				if(value instanceof Integer){
    					Integer entier=(Integer)value;
    					String texte=entier.toString()+" - ";
    					texte+=tableauxExterne[entier.intValue()].toString();
     
    					super.getListCellRendererComponent(list, texte, index, isSelected, cellHasFocus);
    				}
    				else{
    					super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    				}				
    				return this;
    			}
     
    }
     
    		private MonCombo(Integer tableauxExterne[]){
    			super();
    			setModel(new MonModele());
    			setRenderer(new MonRenderer(tableauxExterne));
    			if(getItemCount()>0){
    				setSelectedIndex(0);
    			}
    		}
     
    		// Ca fonctionne plus
    		public void refresh(int index){
    			setSelectedIndex(index);
    			revalidate();
    		}
    	}
     
    	private Exemple(){
    		super("Exemple");
     
    		monCombo=new MonCombo(tableauxExterne);
     
    		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){
    			for(int i=0;i<tableauxExterne.length;i++){
    				tableauxExterne[i]=new Integer(tableauxExterne[i].intValue()-1);
    			}
    		}
    		else{
    			if(e.getSource()==boutonAjouter){
    				for(int i=0;i<tableauxExterne.length;i++){
    					tableauxExterne[i]=new Integer(tableauxExterne[i].intValue()+1);
    				}
    			}
    		}
    		monCombo.refresh(index);
    	}
     
    	public static void main(String args[]){
    		new Exemple();
    	}
    }
    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...

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Fait un repaint alors a la place de revalidate + setSelectedIndex ca devrait marcher.
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  8. #8
    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
    Ca fonctionne...

    J'étais persuadé d'avoir essayé tout les trucs dans le genre :
    - invalidate();
    - repaint();
    - revalidate();
    J'ai jamais bien compris la différence entre ces méthodes...

    En fait, non, je les avais essayé tous a la fois et comme çà n'avait
    pas donné l'effet escompté, j'étais parti sur autre chose...
    Mais je m'y étais peut etre mal pris et comme je n'ai pas insisté...

    Enfin maintenant mon souci est résolu...
    MERCI.
    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. Rafraichissement d'un DataGrid après modification d'un élément d'une liste
    Par JuTs dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 31/03/2015, 17h05
  2. Réponses: 4
    Dernier message: 31/05/2011, 17h30
  3. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  4. Réponses: 6
    Dernier message: 10/07/2004, 12h19
  5. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37

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