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 :

Valeur unique dans la colonne


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Profil pro
    Administrateur système
    Inscrit en
    Mai 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Mai 2002
    Messages : 144
    Par défaut Valeur unique dans la colonne
    Bon, pour être simple (sic) supposons un JTable regroupant des infos sur une population d'étudiants: nom, prénom, ville, etc..., et enfin une colonne classement pour affecter un ordre de mérite à chaque étudiant.
    Dans la mesure ou ce classement est unique (il y a un seul premier de la classe), il faudrait que chaque ligne de la colonne classement soit unique.
    Dans les cellules de cette colonne, je place donc un JComboBox qui propose les valeurs 1 à 20 (il n y a que 20 étudiants par classe), l'éditeur étant au départ initialisé à blanc (" ") pour chaque individu.
    Vous l'avez compris: mon problème est comment vérifier le choix effectué et empêcher l'utilisateur de donner le même classement à plusieurs étudiants ?
    L'idéal serait que la Combo se vide des n° déja utilisés mais là, je ne sais pas faire...
    Voilà, je suis preneur de toute idée qui me permettrait d'implémenter la chose. Ca doit être possible mais j'ai rien trouvé jusqu'ici...

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Alors, l'idéal est de faire ton propre éditeur pour ta table. Si tu ne sait pas trop comment faire, le tuto de sun est un très bon point de départ.

    L'idée est d'avoir un seul éditeur par colonnes d'un même type. Ainsi, à chaque fois qu'une cellule devra passer en mode "édition", un appel à la méthode "getTableCellEditorComponent" de ton éditeur sera effectué.
    La table courante étant fournie en paramètres, il te suffira de mettre à jour ta liste d'items avant de renvoyer ta combo.

    Pense à laisser la possibilité de choisir la note "vide" sinon tu te retrouveras bloqué quand toutes les notes auront été distribuées

  3. #3
    Membre confirmé
    Profil pro
    Administrateur système
    Inscrit en
    Mai 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Mai 2002
    Messages : 144
    Par défaut
    Merci Deaf. Je connaissais le tuto de Sun mais ta suggestion m'a bien éclairé !
    Ci-dessous ce que j'ai fais.
    Tout marche bien à ceci près que je ne vois pas comment je peux réintégrer une note dans le JCombo après que la cellule ait été remise à vide.
    Si tu as une autre idée lumineuse !

    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
     
    public class FTComboEditor extends AbstractCellEditor
                             implements TableCellEditor, ActionListener
    {
        JComboBox myCombo;
        String myValue;
        String[] notes;
     
        public FTComboEditor()
        {
            notes = new String[]{"", "1", "2", "3"};
            myCombo = new JComboBox(notes);
            myCombo.addActionListener(this);
        }
     
        public void actionPerformed(ActionEvent e)
        {
            JComboBox cb = (JComboBox)e.getSource();
            String newSelection = (String)cb.getSelectedItem();
     
    // Si on choisit une note, on la supprime de la liste
            if (!newSelection.isEmpty())
            {
                myValue = newSelection;
                int id = cb.getSelectedIndex();
                myCombo.removeItemAt(id);
     
            }
    //Si on choist "", on met la cellule à vide
            else
            {
                myValue="";
                // ... et reste à réintégrer la note dans la liste
            }
            fireEditingStopped();
     
        }
     
        public Object getCellEditorValue()
        {
            return myValue;
        }
     
        public Component getTableCellEditorComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     int row,
                                                     int column)
        {
            myValue = (String)value;
            return myCombo;
        }

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Dans ta méthode getTableCellEditorComponent, tu peux parcourir toutes les cellules de la même colonne des autres lignes pour récupérer les notes déjà attribuées et les enlever des notes possibles.

    L'idée est de renseigner le modèle de la combo à chaque fois que l'éditeur est sollicité.

  5. #5
    Membre confirmé
    Profil pro
    Administrateur système
    Inscrit en
    Mai 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Mai 2002
    Messages : 144
    Par défaut
    J'ai compris ta remarque mais je ne suis pas sûr de savoir comment l'implémenter. Finalement, voila comment je procède:

    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
     
    public class FTComboEditor extends AbstractCellEditor
                             implements TableCellEditor, ActionListener
    {
        JComboBox myCombo;
        String myValue;
        String[] notes;
     
        public FTComboEditor()
        {
            notes = new String[]{"", "1", "2", "3"};
            myCombo = new JComboBox(notes);
            myCombo.addActionListener(this);
        }
     
        public void actionPerformed(ActionEvent e)
        {
            JComboBox cb = (JComboBox)e.getSource();
            String newSelection = (String)cb.getSelectedItem();
            // Si on choisit une note, on la supprime de la liste:
            if (!newSelection.isEmpty())
            {
                myValue = newSelection;
                int id = cb.getSelectedIndex();
                myCombo.removeItemAt(id);
            }
            else
                //Si on choist "" sur une cellule non vide, 
                //on ré-insère la valeur dans la Combo et on met la cellule à vide:
            {
                if(!myValue.isEmpty())
                {
                    myCombo.addItem(myValue);
     
                    myValue = newSelection;
                }
            }
            fireEditingStopped();
     
        }
     
        public Object getCellEditorValue()
        {
            return myValue;
        }
     
        public Component getTableCellEditorComponent(JTable table,
                                                     Object value,
                                                     boolean isSelected,
                                                     int row,
                                                     int column)
        {
            myValue = (String)value;
            return myCombo;
        }
     
    }
    Ca fonctionne mais je serai content que tu me montres comment tu y arrives avec la méthode getTableCellEditorComponent.

Discussions similaires

  1. [XL-2010] Unique valeur possible dans une colonne
    Par ultima67 dans le forum Conception
    Réponses: 3
    Dernier message: 13/05/2013, 00h39
  2. Réponses: 1
    Dernier message: 25/03/2007, 22h03
  3. Réponses: 4
    Dernier message: 30/01/2007, 21h41
  4. [Tableaux] Valeur unique dans un tableau
    Par glsn dans le forum Langage
    Réponses: 6
    Dernier message: 06/12/2006, 11h18
  5. Nombre de valeurs différentes dans une colonne
    Par KrusK dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/08/2005, 14h18

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