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 :

cellEditor personnalisé pour JComboBox ne fonctionne pas correctement


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut cellEditor personnalisé pour JComboBox ne fonctionne pas correctement
    Salut !

    Je suis en train de développer un programme de gestion sous Java (je n'ai pas vraiment d'expériences), j'ai rencontré un problème un peu bizarre :
    J'ai un JTable qui prend comme modèle un "TableModel" (classe personnalisée), sur sa troisième colonne, il doit prendre des JComboBox qui ne sont pas nécessairement les mêmes (chaque cellule a une valeur différente). Pour chaque item sélectionné dans un JComboBox du tableau, les colonnes qui suivent doivent prendre une certaine valeur. Mon problème est que quand je choisis la première fois un item d'un de ces JComboBox, les colonnes qui suivent se changent automatiquement sans problème, mais si je choisis un autre item, il ne marche plus (c'est à dire qu'il est en train de fonctionner correctement une seule fois et après il ne marche plus, sans aucune exception capturée)

    Le code de mon "CellEditor" personnalisée est:
    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
     
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Map;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JTable;
     
    public class ComboBoxEditor extends DefaultCellEditor{
        private boolean isPushed;
        private ComboBoxListener bListener = new ComboBoxListener();
        private Magasin magasin;
        private CalendarSpecialPrint date;
        private Map<CalendarSpecialPrint, ArrayList<JComboBox>> list;
        private int ligne;
     
     
        public ComboBoxEditor(JCheckBox check, Magasin magasin, CalendarSpecialPrint date, Map<CalendarSpecialPrint, ArrayList<JComboBox>> l) {
            //Par défaut, ce type d'objet travaille avec un JCheckBox
            super(check);
            this.magasin = magasin;
            this.date = date;
            list = l;
            Iterator keys = list.keySet().iterator();
            CalendarSpecialPrint key;
            while(keys.hasNext()){
                key = (CalendarSpecialPrint) keys.next();
                for(int i=0; i<list.get(key).size(); i++){
                    list.get(key).get(i).addActionListener(bListener);
                }
            }
        }
     
        @Override
        public Object getCellEditorValue(){
            Iterator keys = list.keySet().iterator();
            CalendarSpecialPrint key;
            while(keys.hasNext()){
                key = (CalendarSpecialPrint) keys.next();
                if(key.equals(date)){
                    return list.get(key).get(ligne);
                }
            }
            return "";
        }
     
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            //On précise le numéro de ligne à notre listener
            bListener.setRow(row);
            //Idem pour le numéro de colonne
            bListener.setColumn(column);
            //On passe aussi le tableau en paramètre pour des actions potentielles
            bListener.setTable(table);
            //On renvoie le bouton
            ligne = row;
            return (Component) value;
        }
        //Notre listener pour le comboBox
        class ComboBoxListener implements ActionListener{
            private int column, row;
            private JTable table;
            public void setColumn(int col){this.column = col;}
            public void setRow(int row){this.row = row;}
            public void setTable(JTable table){this.table = table;}
            @Override
            public void actionPerformed(ActionEvent event) {
                System.out.println("YES");
                int ind = magasin.getClients().indexOf((Client)table.getValueAt(row, 1));
                if(ind != -1){
                    for(int i=0; i<magasin.getAchats().get(ind).getDates().size(); i++){
                        if(magasin.getAchats().get(ind).getDates().get(i).equals(date) && magasin.getAchats().get(ind).getProduits().get(i).equals((Produit)((JComboBox)(table.getValueAt(row, 2))).getSelectedItem())){
                            table.setValueAt(magasin.getAchats().get(ind).getProduits().get(i).getPrix(), row, 3);
                            table.setValueAt(magasin.getAchats().get(ind).getQuantite().get(i), row, 4);
                            table.setValueAt(magasin.getAchats().get(ind).getVersement().get(i), row, 5);
                            table.setValueAt(magasin.getAchats().get(ind).getReste().get(i), row, 6);
                            table.setValueAt(magasin.getAchats().get(ind).getTotaux().get(i), row, 7);
                            table.revalidate();
                            table.repaint();
                            break;
                        }
                    }
     
                }
            } 
        }
     
    }
    Je tiens à préciser que les classes :
    • CalendarSpecialPrint est une classe héritée de Calendar qui ne fait que surcharger les méthodes "toString" et "equals"
    • Magasin, Achat, Produit et Client sont des beans utilisées dans mon programme


    Merci d'avance pour votre temps et votre aide

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu rentre bien dans actionPerformed à chaque fois (cf le YES) ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonne remarque ! mais c'est encore plus bizarre !

    Je n'ai pas fait attention au début, mais des fois il donne un "YES" pour un clic, des fois 2 et des fois 3 selon le tableau que j'ai utilisé!

    Pour bien comprendre voilà mon tableau :
    Nom : Capture1.PNG
Affichages : 94
Taille : 10,5 Ko

    Sur la troisième colonne j'ai mes comboBox, il y a une date au-dessus du tableau, en la changeant, le tableau change, pour mon exemple, il y en a 3 tableaux ce qui signifie 3 dates. Pour cette première date tel qu'il est, il me donne pour chaque clic un seul "YES", pour le deuxième 2 "YES" et le troisième => 3"YES"

    En plus, j'ai essayé de manipuler le deuxième tableau sans toucher le premier, en changeant les comboBox, j'ai un "NullPointerException" sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ind = magasin.getClients().indexOf((Client)table.getValueAt(row, 1));
    Là, je ne sais plus ce qui se passe !

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Mon conseil serait d'éviter de réutiliser le même combobox pour chaque ligne

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Le malheur est que je les rajoute dynamiquement, je n'utilise pas le même comboBox .. Chaque ComboBox est indépendant des autres, et j'ai vérifié ça et j'ai récupéré leurs valeurs et les afficher dans la console et ça marche, mais quand je clique ça devient une autre histoire !

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Le programme a marché, et je précise bien, avec le même code, j'ai uniquement fait un nouveau projet AVEC LE MÊME CODE sans rien changer !!

    Je trouve ça vraiment bizarre, et je me rappelle il y a à peu près 3 ans j'ai eu un problème et je l'ai résolu de la même manière avec JDK 6.

    Si c'est possible, j'aimerais avoir une explication..

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

Discussions similaires

  1. Aide pour un code qui ne fonctionne pas correctement
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/03/2013, 09h23
  2. Réponses: 18
    Dernier message: 19/04/2007, 17h42
  3. [MySQL] Mon code ne fonctionne pas correctement
    Par bebas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/02/2007, 13h27
  4. Le débogage ne fonctionne pas correctement
    Par BNS dans le forum Visual C++
    Réponses: 4
    Dernier message: 13/07/2006, 13h59
  5. Réponses: 13
    Dernier message: 31/08/2005, 14h03

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