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

AWT/Swing Java Discussion :

JCombobox et setSelectedIndex


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut JCombobox et setSelectedIndex
    Bonjour ce problème va paraître tres basic pour certain (enfin j'espère...) mais j'ai beau avoir lu et essayé de nombreuse solution sur les forums, je reste bloqué!!

    dans une JTable, j'ai des cellules qui contiennent des JCombobox avec des couleurs. Or un utilisateur ne peut selectionner qu'un certain nombre de fois la même couleur (disons 3 fois) et donc, si il essaye de selectionner pour la 4eme fois rouge, un message s'affiche et la JCombobox devrait se remettre sur la couleur par default... mais ca ne marche pas...

    voici le code pour illustrer mon problème :
    insertion de la JCombobox dans la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Object[] couleurs = metier.recupererCouleur();
    //la JTable
    lesCouleurs = new JTable(new CouleurTableModel(reserve.getLesCouleur(), couleur[0]));
     
    TableColumn col = lesCouleurs.getColumnModel().getColumn(3);
    //LA JCombobox
    couleursCombo = new JComboBox(couleurs);
    couleursCombo.setEditable(false);
    couleursCombo.setSelectedIndex(0);
    couleursCombo.addPopupMenuListener(this);
    col.setCellEditor(new DefaultCellEditor(couleursCombo));
    puis l'implementation du listener (PopupMenuListener) :
    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
     
    public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
    		JComboBox combo = (JComboBox)arg0.getSource();
    		//on retire un si la couleur choisie est rouge
    		if(new CouleursExistantes().estCouleurRouge((Color)combo.getSelectedItem()))
    				this.nbColeurRouge -= 1;
    		//je recupere le nombre de rouge possible a afficher
    		int nbRestante = Integer.parseInt(this.nbRougeRestant.getText());
    		//si il n'y en a plus j'affiche le message d'erreur et je met la couleur par default
    		if(nbRestante <= 0){
    			JOptionPane.showMessageDialog(this,"Vous n'avez plus de couleurs rouge" );
    			combo.setSelectedIndex(0);// je reselectionne noir
    			//mais ca ne fonctionne pas!!!!
    		}else
    			this.nbRougeRestant.setText(nbRestante+this.nbColeurRouge +"");
    		this.nbColeurRouge = 0;
     
    	}
     
    	public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
    		//on ajoute 1 au compteur si la couleur precedente etait deja rouge
    		JComboBox combo = (JComboBox)arg0.getSource();
    		if(new CouleursExistantes().estCouleurRouge((Color)combo.getSelectedItem()))
    			this.nbColeurRouge += 1;		
    	}
    Voilà, je butte la dessus depuis quelques jours, si quelqu'un peu me donner un piste, ca serait super!

    merci d'avance,
    night

    ps: bonne année à tous

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Je crois que c'est logique. Tu recupere le nombre de possibilité de ton label ou je ne sais quoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nbRestante = Integer.parseInt(this.nbRougeRestant.getText());
    or tu enleve 1 à this.nbColeurRouge.

    Pas logique, à mon que je ne comprenne pas ta logique.
    Recupere nbRestant et fait ensuite -1 dessus.

    et Ensuite tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.nbRougeRestant.setText(nbRestante+"");
    J'espere que c'est ca sinon je ne vois pas le probleme. Si ce n'est pas ca envoi moi les sources et je te le debug vite fait.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    non, pour ce qui est du nombre de couleur restante, ca marche correctement... et sinon, ca serait un problème d'algorithme.

    j'ai testé et ca passe la ou ce devrait passer (c'est à dire sur le setSelectionItem)

    Le probleme est donc que l'index choisi 0 (pour la couleur noir) n'est pas selectionné sur l'interface (par contre rouge l'est toujours...)

    j'ai essayé d'utiliser les methodes updateUI(), repaint(), ... sur la combobox, sur la frame, rien ne marche...

    merci

  4. #4
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Ah ok. Tu as donc une frame. Et c'est la couleur de la frame qui ne se met pas à jour, c'est ca?

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    non, je vais reformuler... desolé j'ai du mal...

    En gros je cherche un petit script qui permet d'afficher dans une frame une JCombobox contenant certaines valeurs (disons "1", "2", "3", "4") et qui lors de la selection de "3" affiche un message d'erreur (disons "on ne peut pas selectionner 3") et reselectione "2" automatiquement...

    voilà, finis les histoires de couleur, c'était du détail....

    en gros mon probleme se situe au moment de la reselection de la valeur "2". le message d'erreur s'affiche correctement mais "3" reste selectionné

    merci d'avance

    ps: dsl pour la reponse tardive... mais merci de m'avoir repondu!!!

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Deux questions :
    - Si tu fais affiches après ton setSelectedIndex l'index selectionné de la combo, il te donne quoi ? (c'est à dire est-ce que la sélection a réellement changé et qu'il s'agit d'un problème de refresh ou est-ce que l'instruction n'a pas été prise en compte)
    - Pourquoi utiliser ce listener et pas un simple ActionListener qui à mon sens serait quand même plus simple ...

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    à mon avis ca serait plus un pb de refresh...
    mais j'ai essayé les updateUI() et repaint(), .. ca ne fonctionne pas... donc je me le demade...

    pour ce qui est du listener celui ci me parait sympa car on peut effectuer un traitement avan et apres l'apparition de la liste ce qui est plus compliquer avec l'ActionListener (maintenant c'est un choix comme un autre, si il le faut je peux changer...)

  8. #8
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Pour être sûr du problème, si tu réduit la fenêtre et la fait réapparaître tu vois la nouvelle sélection ?
    Sinon, pour le listener, je disais ça parce que à mon sens dans ta problématique tu veux gérer quelquechose quand l'utilisateur a sélectionné une certaine valeur, et non vraiment faire quelquechose quand il va sélectionner ou a terminé de selectionner. Au passage, si ton utilisateur change la valeur au clavier (avec des tab et les flèches) ton listener ne verra rien

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    non j'ai beau reduire et agrandir la fenêtre, ca reste la valeur interdtie qui est selectionnée...

    pour ce qui est du listener, tu as a raison, j'avais pas pensé à ce cas de figure!!
    je le change de suite...
    merci

  10. #10
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    A mon avis alors il doit vraiment y avoir un conflit dans l'ordre des événement. Il se peut que ta commande qui change le selectedIndex arrive avant la commande "interne" de la combobox qui change le selectedIndex (je ne sais pas si je suis super clair).
    A mon avis avec l'actionlistener tu ne devrais avoir aucun souci ...

  11. #11
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    j'ai testé l'action listener mais c psa ca....
    a mon avis ca doit provenir du fait, comme je l'avais dit dans le 1er message que les JCombobox son contenu dans une cellule d'une JTable.
    (je vais gratter par là...)

  12. #12
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    C'est pas ça c'est à dire que quand tu implémentes avec l'actionListener ça te donne exactement le même comportement qu'avant ? Et si tu debug tu vois bien le actionPerformed être appelé ?

  13. #13
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    ok j'ai trouvé une idée pour avancé...
    je viens de reecrire un programme "simple" qui illustre le probleme, le voici :
    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
     
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.DefaultCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.TableColumn;
     
     
    public class Main {
     
    	public static void main(String[] argv){
    		JFrame frame = new JFrame("test");
     
    	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    frame.getContentPane().add(new MyPanel());
     
    	    frame.pack();
    	    frame.setVisible(true);
    	}
    }
     
    class MyPanel extends JPanel implements ActionListener{
    	JTable places = new JTable(5,3);
    	String [] s = {"bleu", "rouge", "vert"};
    	JComboBox tarifsCombo = new JComboBox(s);
     
    	public MyPanel(){
    		tarifsCombo.setEditable(false);
    		tarifsCombo.setSelectedIndex(2);
    		//tarifsCombo.addPopupMenuListener(this);
    		tarifsCombo.addActionListener(this);
     
    		TableColumn col = places.getColumnModel().getColumn(2);
    		col.setCellEditor(new DefaultCellEditor(tarifsCombo));
     
    		places.setPreferredScrollableViewportSize(new Dimension(400,250));
    		places.setRowHeight(20);
    		this.add(places);
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
    		if(this.tarifsCombo==arg0.getSource()){
    			System.out.println(this.tarifsCombo.getSelectedItem());
    			tarifsCombo.setSelectedIndex(2);
    		}
     
    	}
    }
    voilà une classe qui affiche un tableau et dans lequel j'aimerais n'avoir que vert selectionné (3eme colonne)

    quand je clique sur la fleche du bas vert et bien selectionné (tout comme dans mon pb) mais si je selectionne rouge, "rouge" s'affiche alors que je souhaiterais que ce soit "vert" encore ....

  14. #14
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    je viens de voir un probleme: il faut que je mette des JComboBox differents pour chacune des cellules...

    car quand je fais, dans la methode actionPerformed un addItem("noir) sur la JComboBox, ca m'ajoute "noir" à toute...

    C'est peut être de la que ca vient aussi...

  15. #15
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Hummm ... à mon avis tu ne peux pas t'en sortir avec des listeners sur l'editeur de la cellule, mais uniquement avec un listener sur le modèle de ta JTable.
    Donc à voir TableModelListener pour être notifié du changement de valeur d'une sélection et agir à ce niveau là et non au niveau de l'éditeur ...

  16. #16
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Oui le même objet est utilisé pour quand tu veux éditer une des cases quelconques. Le problème c'est que si tu mets une JComboBox différente à chaque case tu vas avoir quelquechose d'extrèmement lourd, et qui en plus ne fonctionnera pas forcément car attention, ce que tu vois c'est le renderer quand tu as fini de sélectionner, pas l'editor ...

  17. #17
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Par défaut
    bingo!!!
    c'est bon j'ai essayer quelque chose et ca marche... par contre, comme tu le dis, ca risque d'être tres tres lourd pour de grosse table (ce qui n'est pas mon cas fort heureusement...)

    j'ai simplement refait le cellEditor de la colonne comme voici :
    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
     
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.AbstractCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableColumn;
     
     
    public class Main {
     
    	public static void main(String[] argv){
    		JFrame frame = new JFrame("test");
     
    	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    frame.getContentPane().add(new MyPanel());
     
    	    frame.pack();
    	    frame.setVisible(true);
    	}
    }
     
    class MyPanel extends JPanel implements ActionListener{
    	JTable places = new JTable(5,3);
     
    	public MyPanel(){
    		TableColumn col = places.getColumnModel().getColumn(2);
    		col.setCellEditor(new MyCellEditor(this));
     
    		places.setPreferredScrollableViewportSize(new Dimension(400,250));
    		places.setRowHeight(20);
    		this.add(places);
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
    		if(arg0.getSource() instanceof JComboBox ){
    			JComboBox tmp = (JComboBox)arg0.getSource();
    			System.out.println(tmp.getSelectedItem());
    			tmp.setSelectedIndex(2);
    			this.updateUI();
    		}
    	}
    }
    class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
     
    	String [] s = {"bleu", "rouge", "vert"};
        protected JComboBox tarifsCombo2; 
     
        public MyCellEditor(ActionListener a) {
        	tarifsCombo2 = new JComboBox(s);
        	tarifsCombo2.setEditable(false);
    		tarifsCombo2.setSelectedIndex(2);
    		tarifsCombo2.addActionListener(a);
        }
        public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,int row,int column) {
            return tarifsCombo2;
        }
     
        public Object getCellEditorValue() {
            return tarifsCombo2.getSelectedItem();
        }
    }
    en tout cas, merci beaucoup chtiq, d'avoir passer autant de temps sur mon problème, mais ton aide a été fructueuse!!!

    il me reste plus qu'a appliquer ca dans mon programme!
    bonne soirée, et encore merci!!!
    night

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

Discussions similaires

  1. [JComboBox] Mmise à jour contenu
    Par java_math dans le forum Composants
    Réponses: 4
    Dernier message: 16/07/2008, 18h27
  2. JComboBox action
    Par calypso dans le forum Composants
    Réponses: 4
    Dernier message: 02/08/2004, 15h41
  3. [jcombobox]l'élément affiché lié à un autre objet
    Par szdavid dans le forum Composants
    Réponses: 3
    Dernier message: 11/05/2004, 10h17
  4. [swing][JComboBox]Problème de taille
    Par n!co dans le forum Composants
    Réponses: 8
    Dernier message: 06/03/2004, 10h53
  5. Couleur d'une JComboBox disabled
    Par ced dans le forum Composants
    Réponses: 6
    Dernier message: 06/01/2004, 15h33

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