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 dans JTable


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut Jcombobox dans JTable
    Bonjour à tous,

    avant de de commencer je tiens à m'excuser car je sais que ce sujet à été traiter des centaines de fois mais je n'arrive vraiment pas à mettre une JComboBox dans une JTable, et ce malgrè la documentation disponible sur le net.

    Je construit ma JTable avec un tableModel.Voila ce que j'ai fait:

    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
     
    class MonModele extends AbstractTableModel {
                Vector nomColonne=new Vector(); //les noms de colonnes
                Vector elementUn = new Vector();
     
                public MonModele(String taxo,String onglet,String libelle,String Contextref) {
                    nomColonne.addElement("Compte");
                    nomColonne.addElement("Actif");
                    nomColonne.addElement("Operateur");
                    String StrSQL;
                    StrSQL ="SELECT COMPTE,ACTIF FROM MAPPING WHERE TAXONOMIE='"+taxo+"' AND GABARIT='"+onglet+"' AND ELEMENTNAME='"+libelle+"'  AND CONTEXTREF='"+Contextref+"'";
                    try{
                        Database connect=new Database();
                        connect.OpenDB();
                        ResultSet rs=connect.Execute(StrSQL);
     
                        while (rs.next()){
     
                            elementUn.addElement(rs.getString("COMPTE"));
                            if (rs.getString("ACTIF").equals("Y")){
                                elementUn.addElement(new Boolean(true));
                            }
                            else{
                                elementUn.addElement(new Boolean(false));
                            }
     
                            JComboBox operateur;
                            operateur=new JComboBox();
                            operateur.addItem("+");
                            operateur.addItem("-");
                            elementUn.addElement(operateur);
     
                        }
                    }
                    catch (Exception E){
                        JOptionPane.showMessageDialog(null, "Impossible de se connecter à cette BD" +
                        "Erreur " + E.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
                    }
                }
     
                public int getColumnCount() {
                return nomColonne.size();
                 }
     
                 public int getRowCount() {
                  return elementUn.size()/getColumnCount();
                 }
     
                 public String getColumnName(int columnIndex) {
                  String colName="";
                  if (columnIndex<=getColumnCount())
                    colName=(String)nomColonne.elementAt(columnIndex);
                    return colName;
                 }
     
                 public Class getColumnClass(int column){
                    return getValueAt(0, column).getClass();
                 }
     
                 public boolean isCellEditable(int rowIndex, int columnIndex) {
                  return false;
                 }
     
                 public Object getValueAt(int rowIndex, int columnIndex) {
                  return elementUn.elementAt(
                           (rowIndex*getColumnCount())+columnIndex);
                 }
     
                 public void setColumnName(Vector colNames){
                        //columnNames=new Vector(colNames.length);
                        nomColonne=colNames;
                         fireTableStructureChanged();
                }
     
                public void removeRow(int row) {
                    elementUn.removeElementAt(row);
                    fireTableRowsDeleted(row, row);
                }
            }
    Voila comment j'affecte mon model à ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    jTable1=new JTable();
    MonModele model =new MonModele( taxo, onglet, libelle, Contextref);
    jTable1.setModel(model);
    jTable1.createDefaultColumnsFromModel();
    jTable1.getTableHeader().setReorderingAllowed(false);

    Et bien entendu, dans ma cellule ça m'affiche Javax.swing.JComboBox...

    Il y a quelquechose qui m'échappe, si quelqu'un pouvait m'expliquer le fonctionnement, ça me débloquerai pas mal!

    Merci d'avance!

    EDIT: Je suis bien sur allé voir la javadoc et j'ai rajout ce petit bout de code mais sans succés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TableColumn cH = jTable1.getColumnModel().getColumn(2);
                JComboBox operateur;
                operateur=new JComboBox();
                operateur.addItem("+");
                operateur.addItem("-");
                TableCellEditor  cellEditorRv0 = new DefaultCellEditor (operateur);
                cH.setCellEditor(cellEditorRv0);

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Bonjour, euh ... tu es loin du compte ^^

    Je te conseil de lire les 2-3 tutoriels de développez sur les JTable ... Il te faudra utiliser des TableCellRenderer, et pas directement des JComboBox dans ton modèle ?!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Salut,

    Ah bon?

    Pourtant sur la javaDoc ils font ça en quelques ligne (cf le dernier bout de code de mon précédent message).

    la je suis en train de lire ça
    http://mbaron.ftp-developpez.com/javase/javavisu.pdf

    ça à l'air tout à fait différent de la doc java.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Justement c'est ce que j'ai fait (à peu près):

    agade :
    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
     
    jTable1=new JTable();
                MonModele model =new MonModele( taxo, onglet, libelle, Contextref);
                jTable1.setModel(model);
                jTable1.createDefaultColumnsFromModel();
                jTable1.getTableHeader().setReorderingAllowed(false);
     
     
                TableColumn cH = jTable1.getColumnModel().getColumn(2);
                JComboBox operateur;
                operateur=new JComboBox();
                operateur.addItem("+");
                operateur.addItem("-");
                TableCellEditor  cellEditorRv0 = new DefaultCellEditor (operateur);
                cH.setCellEditor(cellEditorRv0);
    la pô compris

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    l'éditeur est utilisé quand tu clic sur la cellule, pour simplement afficher il faut utiliser les renderers (de la même façon que l'editor).

    En l'occurrence dans ton cas tu n'auras pas l'utilité des editors vu que tu renvoi false dans isCellEditable ... donc jamais d'édition, jamais d'editors ...

    D'ailleurs ton code pour les fonctions getValueAt et autres me semble plus qu'étrange ... en même temps tout ton modèle est plus qu'étrange ... normalement dans ton vecteur (beurk!) elements tu dois ajouter des Objets contenant les différents éléments, comme compte, actif, ...

    Et getValueAt ressemblerait par exemple à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (columnIndex == 0) return elements.getElementAt(rowIndex).getCompte();
    else if (columnIndex == 1) return elements.getElementAt(rowIndex).getActif();
    // etc ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    ok, j'ai compris maintenant ça 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
     
    jTable1=new JTable();
                MonModele model =new MonModele( taxo, onglet, libelle, Contextref);
                jTable1.setModel(model);
                jTable1.createDefaultColumnsFromModel();
                jTable1.getTableHeader().setReorderingAllowed(false);
     
                DefaultTableCellRenderer comboRenderer = new DefaultTableCellRenderer() { 
                    public void setValue(Object value) { 
                          super.setValue(value); 
                    } 
                };
     
                TableColumn cH = jTable1.getColumnModel().getColumn(2);
                JComboBox operateur;
                operateur=new JComboBox();
                operateur.addItem("+");
                operateur.addItem("-");
                TableCellEditor  cellEditorRv0 = new DefaultCellEditor (operateur);
                cH.setCellEditor(cellEditorRv0);
                cH.setCellRenderer(comboRenderer);
    Pour ceux qui galère comme moi, je remet également ce que j'ai mis dans mon tableModel:

    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
     
    class MonModele extends AbstractTableModel {
                Vector nomColonne=new Vector(); //les noms de colonnes
                Vector<Vector> donnees=new Vector<Vector>(); //les donnees de la table
                Vector elementUn = new Vector();
     
                public MonModele(String taxo,String onglet,String libelle,String Contextref) {
                    nomColonne.addElement("Compte");
                    nomColonne.addElement("Actif");
                    nomColonne.addElement("Operateur");
                    String StrSQL;
                    StrSQL ="SELECT COMPTE,ACTIF FROM MAPPING WHERE TAXONOMIE='"+taxo+"' AND GABARIT='"+onglet+"' AND ELEMENTNAME='"+libelle+"'  AND CONTEXTREF='"+Contextref+"'";
                    try{
                        Database connect=new Database();
                        connect.OpenDB();
                        ResultSet rs=connect.Execute(StrSQL);
                        //on place le curseur sur le dernier tuple
                        rs.last();
                        //on récupère le numéro de la ligne
                        int nombreLignes = rs.getRow();
                        //on repace le curseur avant la première ligne
                        rs.beforeFirst();
     
                        while (rs.next()){
     
                            elementUn.addElement(rs.getString("COMPTE"));
                            if (rs.getString("ACTIF").equals("Y")){
                                elementUn.addElement(new Boolean(true));
                            }
                            else{
                                elementUn.addElement(new Boolean(false));
                            }
     
                            elementUn.addElement("+");
                        }
                    }
                    catch (Exception E){
                        JOptionPane.showMessageDialog(null, "Impossible de se connecter à cette BD" +
                        "Erreur " + E.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
                    }
                }
     
                public int getColumnCount() {
                return nomColonne.size();
                 }
     
                 public int getRowCount() {
                  return elementUn.size()/getColumnCount();
                 }
     
                 public String getColumnName(int columnIndex) {
                  String colName="";
                  if (columnIndex<=getColumnCount())
                   colName=(String)nomColonne.elementAt(columnIndex);
                  return colName;
                 }
     
                 public Class getColumnClass(int column){
                    return getValueAt(0, column).getClass();
                 }
     
                 public boolean isCellEditable(int rowIndex, int columnIndex) {
                  return true;
                 }
     
                 public Object getValueAt(int rowIndex, int columnIndex) {
                  return elementUn.elementAt(
                           (rowIndex*getColumnCount())+columnIndex);
                 }
     
                 public void setColumnName(Vector colNames){
                        //columnNames=new Vector(colNames.length);
                        nomColonne=colNames;
                         fireTableStructureChanged();
                }
     
                public void removeRow(int row) {
                    elementUn.removeElementAt(row);
                    fireTableRowsDeleted(row, row);
                }
            }
    Merci pour vos indications!

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    P.S. Le **Renderer sert uniquement à afficher des valeurs. Le **Editor permet de les éditer, et donc d'affecter une nouvelle valeur à une cellule du tableau.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    oui, je viens de comprendre. J'avoue que je n'avais pas conscience que ces manipulations étaient essentielles mais leur utilisation n'est pas forcément simple à comprendre (je viens du DotNet et ce genre d'opérations ne s'effectue pas dans la même logique).

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    J'ai en core un petit problème, la sélection marche très bien MAIS lorsque je change de valeur, celle ci est afféctée à l'ensemble de la colonne!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DefaultTableCellRenderer comboRenderer = new DefaultTableCellRenderer() { 
                    public void setValue(Object value) { 
                            value=operateur.getSelectedItem().toString();
                            super.setValue(value);          
                    } 
                };
    Est ce qu'il faut rajouter un itemlistener sur le combobox pour ensuite modifier le model et uniquement la ligne selectionnée ou existe-t-il une méthode plus adaptée?


    En l'occurrence dans ton cas tu n'auras pas l'utilité des editors vu que tu renvoi false dans isCellEditable ... donc jamais d'édition, jamais d'editors ...
    Justement, j'ai modifié cela, c'était une erreur.

    Pourquoi les vecteurs sont-ils beurk?

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Parce qu'ils sont des réminiscences de Java 1.0, avant que les collection ne soient pleines et fonctionnelles. De plus, leurs méthodes sont synchronisées, ce qui peut en déranger plus d'un

    Depuis Java2, on préfère utiliser les méthodes standardisées par l'api Collection. Elles sont plus efficaces et standardisées.

    Pour ta question, ta proposition est une possibilité, mais il est préférable d'utiliser les éditeurs pour attribuer une valeur à une cellule.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    ok merci encore.

    Donc si j'ai bien compris, il serait plus "propre" d'utiliser par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String [] titreColonne {...} ou Object[] donnees{...}
    à la place de mes vecteurs? J'en prend note.

    Pour en revenir au sujet je dois donc me tourner vers une classe qui hérite de **CellEditor...

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Pour la question principale, oui, l'éditeur est le mieux. Il en existe déjà quelques uns par défaut (qui te permettent de faire de l'édition de nombre, de cocher des checkboxes, etc.) dont tu peux t'inspirer afin de voir comment cela fonctionne. Le code source facilement trouvable via Google.

    Pour l'autre, je ne pensais pas aux tableaux, mais aux collections : comme par exemple : java.util.Collection<?>, java.util.List<?>, java.util.Map<?,?>, etc.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Maintenant je te conseil de finir de lire les tutos sur le MVC utilisé pour JTable, JTree etc ... comme tu l'avais commencé, ces composants étant les plus avancés de Swing, mais aussi les plus difficile à maîtriser. Essayes de comprendre le cours avant d'appliquer "bêtement" les morceaux de code que tu vois. (dsl pour l'expression :p)

    Ah oui, la méthode setValue(Object) sur un CellRenderer ? elle aurait plutôt sa place dans un CellEditor nan ? aller, va lire les cours

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Ah ouai c'est juste!

    D'habitude j'aime bien prendre le temps de bien comprendre les choses, mais là il se trouve que je suis très pris par le temps, donc j'ai bosser vite et salement, je vais prendre le temps de lire tout cela...

    Merci encore!

Discussions similaires

  1. Dérouler JcomboBox dans Jtable
    Par hawax dans le forum Composants
    Réponses: 0
    Dernier message: 30/03/2009, 02h02
  2. Rafraichissement Jcombobox dans jtable
    Par palex dans le forum Composants
    Réponses: 1
    Dernier message: 29/08/2007, 11h52
  3. Réponses: 6
    Dernier message: 20/09/2006, 11h01
  4. supprimer un item d'un jcombobox dans une jtable
    Par bellout dans le forum Composants
    Réponses: 6
    Dernier message: 22/06/2006, 16h06
  5. Vérification de l'etat des JComboBox dans JTable
    Par nicotine002 dans le forum Composants
    Réponses: 5
    Dernier message: 26/01/2006, 11h47

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