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 :

[JTable][JComboBox] rendre un combo box dans un Jtable


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut [JTable][JComboBox] rendre un combo box dans un Jtable
    bonjour,

    voilà je n'ai pas trouver mon bonheur apres avoir parcouru le forum.

    voilà je souhaite mettre un JComboBox dans mon JTable. Je vais essayé d'etre clair car ce n'est pas simple ...

    sur le site de sun j'ai vu qu'ils l'utilisent le bout de code suivant

    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
     
    public void setUpSportColumn(JTable table,
                                     TableColumn sportColumn) {
            //Set up the editor for the sport cells.
            JComboBox comboBox = new JComboBox();
            comboBox.addItem("Snowboarding");
            comboBox.addItem("Rowing");
            comboBox.addItem("Knitting");
            comboBox.addItem("Speed reading");
            comboBox.addItem("Pool");
            comboBox.addItem("None of the above");
            sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
     
            //Set up tool tips for the sport cells.
            DefaultTableCellRenderer renderer =
                    new DefaultTableCellRenderer();
            renderer.setToolTipText("Click for combo box");
            sportColumn.setCellRenderer(renderer);
        }
    Je pensais le mettre dans le constructeur de mon JTable sauf que je ne connais pas les valeurs de ma combobox à la création de mon Jtable. Je créé ma combobox dans la méthode getValueAt de mon model, mais je ne sais pas si c'est le bon endroit pour le faire. faut il le mettre dans ma classe Table ou dans mon model ? Pour l'instant il m'affiche mon JComboBox comme une string

    là je bloque, si quelqu'un pouvait m'aider merci beaucoup.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Il te faut fournir un TableCellRenderer qui soit capable de dessiner une combo. Meme chose en cas d'edition, il faut un TableCellEditor.

    Regarde la demo demo\jfc\SwingSet2\ fournie avec le JDK il y a un exemple sur les tables et la colonne "Favorite Color" contient un editor (clique sur une cellule) qui est une combo et un renderer simple qui affiche la couleur. Tu peux t'inspirer du code source de la demo pour resoudre ton probleme.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    merci je regarde ça ....

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    je vois ce que tu veux dire mais le problème est le meme.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    JComboBox comboBox = new JComboBox();
    	comboBox.addItem(aqua);
    	comboBox.addItem(beige);
    	comboBox.addItem(black);
    	comboBox.addItem(blue);
     
    [color=red]TableColumn colorColumn = tableView.getColumn(getString("TableDemo.favorite_color"));
            // Use the combo box as the editor in the "Favorite Color" column.
            colorColumn.setCellEditor(new DefaultCellEditor(comboBox));[/color]
    je peux pas ajouter mes données dans le combo car je ne connais pas les données au moment ou j'instancie ma table. à la place du code en rouge j'ai mis ce code dans le constructeur de ma table, mais je ne sais pas si c'est le meilleur moyen. je sais pas vraiment ou placer le remplissage de ma combo box dans ma table, dans le model ou dans l'objet qui représente les données .j'ai beau essayé dans tous les sens ça fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JComboBox combo=new JComboBox();
     
    		setModel(new LocationTableModel(combo));
    		TableColumn column1 = this.getColumnModel().getColumn(1);
    		column1.setCellRenderer(new DefaultTableCellRenderer());
    		column1.setCellEditor(new DefaultCellEditor(combo));


    le combobox est créé avant, moi je ne connais pas les données à mettre dans le combo box à la base .... [/quote]

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En fait je vois plutot la solution du probleme comme ca (en gardant une liste de couleur pour illustrer mon propos) dans ta table :

    - tu met dans cette colonne des objets de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class ColorChoice {
      public Color[] availableColors; // ou List<Color>
      public Color selectedColor;
    }
    - tu affectes a la class ColorChoice un cell renderer capable de rendre selectedColor a l'ecran.

    - tu affectes a la class ColorChoice un cell editor qui affiche une combo avec le contenu de availableColors et change la valeur de selectedColor en cas d'edition. La combo est vide au depart mais est remplie avec les valeurs possible au moment de l'invocation de l'editeur.

    Comme ca chaque ligne peut avoir son propre choix de valeurs disponibles dans lequels piocher la valeur a mettre. Et tu peux modifier cette plage de choix de valeurs manuellement quand tu veux.
    A toi de voir comment adapter cela a ton type stocke dans ta table.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    si je comprends bien tu as quand meme besoin de valeur de départ pour initialiser ton combo ... non ? Car moi en faite les données du combo ne sont connus que en fonction d'un résultat d'une requete et je peux donc pas initialiser les valeurs avant de les connaitre.
    Enfin je relirais demain je serais peut etre un peu plus frais ...

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Dans ce cas tu laisses tomber ma soluce et a la place tu effectues cette requete pile au moment ou l'editeur est invoque sur cette cellule de cette colonne pour connaitre la liste des valeurs que tu peux mettre dans ta combo. Il doit y avoir des evenements permettant de detecter un debut d'edition d'une cellule.

    Cependant si ton utilisateur clique beaucoup sur la cellule ou si toutes les cellules d'une meme colonne ont la meme plage de valeurs tu vas peut-etre vouloir cacher les valeurs recuperees par la requete, au moins pour un certains temps, de maniere a eviter de surcharger ta base.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    en faite pour t'expliquer mon processus je met les fichiers XML ouverts dans un Jtree. Quand je clique sur un des fichiers je lance le parsing du fichier une fois le fichier parser je recherche dans une base de donnée les entrées susceptibles de correspondre aux valeurs extraites et apres j'ajoute les données dans la table. Mais ma table est initialisé au lancement de mon application avec zéro objet dedans. Et si je comprends bien je devrais mettre un celleditor au moment ou je construis la table non ? Donc la solution serait d'instancier ma table au moment ou je clique sur le fichier ?

    en tous cas merci de te pencher sur mon problème.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tu peux faire ta requete quand la methode getTableCellEditorComponent est appelee sur la cellule editee (voir l'interface TableCellEditor).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    bonjour et merci encore pour le coup de main.

    voilà j'ai bossé cet après midi et je suis tombé sur un post à peu près similaire au mien

    et d'apres le code qui y est inscrit il suffit de specifier dans les classes des composants a afficher et de redéfinir la méthode getColumnClass(int index)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //indique a la jtable comment afficher les objets, chaque objet class du tableau correspondant a une colonne
     
       Class classes[] = new Class[] {JComponent.class, JComponent.class, JComponent.class };
     
    .........
     
    public Class getColumnClass(int index) { return classes[index]; }
    j'ai essayé ça mais ça n'a pas l'air de marcher. Est ce moi qui fait une erreur ou ça n'a rien a voir avec ce que je veux faire d'apres toi ?




    Sinon apres je suis tombé la dessus et pense essayé cette méthode qui si je comprends bien permettrais a peu près ce que je veux... enfin je crois. Mais moi je ne dois pas avoir besoin de CellRenderer pusique je veux garder l'affichage en combobox. Mais là il va surement se poser un autre problème comment avoir des valeurs différentes suivants les lignes ??

    la page se trouve ici : http://www.javaworld.com/javaworld/j...avatip102.html

    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
     
    JTable table = new JTable();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
     
        // Add some columns
        model.addColumn("A", new Object[]{"item1"});
        model.addColumn("B", new Object[]{"item2"});
     
        // These are the combobox values
        String[] values = new String[]{"item1", "item2", "item3"};
     
        // Set the combobox editor on the 1st visible column
        int vColIndex = 0;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellEditor(new MyComboBoxEditor(values));
     
        // If the cell should appear like a combobox in its
        // non-editing state, also set the combobox renderer
        col.setCellRenderer(new MyComboBoxRenderer(values));
     
        public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
            public MyComboBoxRenderer(String[] items) {
                super(items);
            }
     
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                if (isSelected) {
                    setForeground(table.getSelectionForeground());
                    super.setBackground(table.getSelectionBackground());
                } else {
                    setForeground(table.getForeground());
                    setBackground(table.getBackground());
                }
     
                // Select the current value
                setSelectedItem(value);
                return this;
            }
        }
     
        public class MyComboBoxEditor extends DefaultCellEditor {
            public MyComboBoxEditor(String[] items) {
                super(new JComboBox(items));
            }
        }

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je verrai plutot ca comme ca (a verifier si ca marche bien sur ; je n'ai rien teste) :

    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
     
    public class MyComboBoxRenderer extends JComboBox implements tableCellRenderer { 
      /** Creates a new instance.
      */
      public MyComboBoxRenderer() { 
        super(); 
      } 
     
      /** @inheritDoc
      */
      @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
        if (isSelected) { 
          setForeground(table.getSelectionForeground()); 
          setBackground(table.getSelectionBackground()); 
        } 
        else { 
          setForeground(table.getForeground()); 
          setBackground(table.getBackground()); 
        } 
        // On enleve la valeur de la cellule precedente.
        removeAllItems();
        // Ajouter la valeur actuelle.
        if (value != null) {
          addItem(value);
        }
        // Selectionner la valeur actuelle.
        setSelectedItem(value); 
        return this; 
      } 
    }
     
    public class MyComboBoxEditor extends DefaultCellEditor { 
      /** Creates a new instance.
      */
      public MyComboBoxEditor() { 
        super(new JComboBox()); 
      } 
     
      /** @inheritDoc
      */
      @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        super.getTableCellEditorComponent(table, value, isSelected, row, column);
        JComboBox combo = (JComboBox)delegate;
        Object[] values = // FAIRE LA REQUETE ICI.
        // !!! ATTENTION si la requete est longue ou plante.
        // On enleve les valeurs de la cellule precedente.
        combo.removeAllItems();
        // Rajouter le resultat de la requete.
        for (Object val : values) {
          combo.addItem(val);
        }
        // Selectionner la valeur actuelle.
        combo.setSelectedItem(value);
        return this;
      }
    }
    Sinon pour le renderer un simple DefaultTableCellRenderer suffit. mais bon c'est vrai qu'avoir la combo dessinee peut indiquer a l'utilisateur qu'il peut cliquer dessus.

    Comme tu l'auras vu les methodes permettant a la table de retrouver les editeur et les renderer demandent un parametre de type Class. Or par default le TableModel renvoie Object.class pour toutes les colonnes et ce sont donc toujours l'editeur et le renderer par defaut qui est utilise. Si tu as un type d'objet bien specifique Toto, surcharger getColumnClass associe avec le setCellEditor et le setCellRenderer permet d'avoir un editeur et renderer specifiques aux objets de cette classe.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    bon avec la méthode du de rédéfiniton que j'avais cité je suis arrivé à avoir l'affichage des combobox mais je ne sais pas pourquoi je ne peux pas les éditer ... donc je sais meme pas ce qu'elles contiennent si elles ont bien les trois valeurs de test que j'ai mis ou pas .... bref c'est pas loin mais c'est pas ça encore

    j'ai essayé la méthode que tu m'as décrite mais je n'arrive pas a compiler l'éditeur.
    d'une part sur le "delegate", que je ne connias pas (ou que j'ai oublié surement ) pourtant j'en ai fait pas mal du java...

    j'ai interprété ça comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JComboBox combo = (JComboBox)super.getTableCellEditorComponent(table, value, isSelected, row, column);
    mais je ne sais pas si c'est ça ...
    et d'autre part le return this à la fin que j'ai remplacer par return combo à la fin

    enfin là je ne sias plus trop il est dejà 4h00 du matin donc si c'est du n'importe quoi c'est possible ...

    bref en utilisant ta méthode j'ai toujours le combobox qui s'affiche mais impossible de l'ouvrir comme avec la 1ere méthode ... et m'affiche le comboBox en string dedans (là je capte pas pourquoi j'ai tellement bidouiller pffff).

    bref je ne sais plus trop quoi mettre dans mon model pour le getValue at pour cette colonne.

    En tous cas si j'avais su la galere que c'était juste pour faire un combobox dynamique je me serais peut etre pas lancé la dedans j'aurai fais une liste toute bete qui aurait été surement plus simple à gérer.

    je verrais ça demain matin

    En tous cas merci beaucoup pour ta patience et pour ton aide.

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je regarderai et ferai des tests par moi-meme ce soir apres ma seance de squash (d'ici 2~4h donc). Au pire des cas je m'aracherai moi aussi les cheveux.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Voila, c'est moins compliqué que prévu :

    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
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    package test;
     
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class ComboTable {
      /** Pseudo values.
       */
      enum Val {
        TOTO, TITI, TUTU, TATA, GAGA, MOMO, GUGU, BYE, AILLE, OUILLE, OUI, NON, YES, NO, JA, NEIN;
      }
     
     
      /** The pseudo database.
       */
      private static final Map<Integer, java.util.List<Val>> DATA_BASE = createDataBase();
     
      /** Self test main.
       * @param args Arguments from the command-line.
       */
      public static void main(String ...args) {
        DefaultTableModel tableModel = new DefaultTableModel() {
          /** {@inheritDoc}
           */
          @Override public Class getColumnClass(int i) {
            if (i == 1) {
              return Val.class;
            }
            return String.class;
          }
        };
        tableModel.setColumnCount(2);
        tableModel.setColumnIdentifiers(new Object[] {"Name", "Choice"});
        for (Val val : Val.values()) {
          tableModel.addRow(new Object[] {val.toString(), val});
        }
        JTable table = new JTable(tableModel);
        table.setDefaultRenderer(Val.class, new ComboTableCellRenderer());
        table.setDefaultEditor(Val.class, new ComboTableCellEditor(new DataBaseQuerySystem()));
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
      }
     
      /** Create the pseudo data base.
       * @return The pseudo data base.
       */
      private static Map<Integer, java.util.List<Val>> createDataBase() {
        Random random = new Random();
        Map<Integer, java.util.List<Val>> result = new HashMap<Integer, java.util.List<Val>>();
        Val[] vals = Val.values();
        int valueNumber = vals.length;
        int i = 0;
        for (Val val : vals) {
          java.util.List<Val> list = new ArrayList<Val>(4);
          list.add(val);
          while (list.size() != 4) {
            int index = random.nextInt(valueNumber);
            Val v = vals[index];
            if (!list.contains(v)) {
              list.add(v);
            }
          }
          result.put(i, Collections.unmodifiableList(list));
          i++;
        }
        return Collections.unmodifiableMap(result);
      }
     
      /** The combo box table cell renderer.
       */
      private static class ComboTableCellRenderer extends JComboBox implements TableCellRenderer {
        /** {@inheritDoc}
         */
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
          } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
          }
          removeAllItems();
          if (value != null) {
            addItem(value);
          }
          setSelectedItem(value);
          return this;
        }
      }
     
     
      /** The combo box table cell editor.
       */
      private static class ComboTableCellEditor extends DefaultCellEditor {
        private DataBaseQuerySystem dbConnect;
     
        public ComboTableCellEditor(DataBaseQuerySystem dbConnect) {
          super(new JComboBox());
          this.dbConnect = dbConnect;
        }
     
        /** {@inheritDoc}
         */
        @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
          Component editor = super.getTableCellEditorComponent(table, value, isSelected, row, column);
          JComboBox combo = (JComboBox) getComponent();
          combo.removeAllItems();
          System.out.println("query for row" + row);
          java.util.List<Val> authorizedValues = dbConnect.getAuthorizedValuesForRow(row);
          for (Val authorizedValue : authorizedValues) {
            combo.addItem(authorizedValue);
          }
          combo.setSelectedItem(value);
          return editor;
        }
      }
     
     
      /** Query data base.
       */
      private static class DataBaseQuerySystem {
        /** Query the data base.
         * @param row Current row.
         * @return A list of authorized values.
         */
        public java.util.List<Val> getAuthorizedValuesForRow(int row) {
          return DATA_BASE.get(row);
        }
      }
    }
    Maintenant reste à comprendre pourquoi des fois il faut cliquer 2 fois sur la combo pour que le popup contenant la liste s'affiche (la requete n'est appelee qu'une seule fois)... J'ai essayé d'appeler combo.setIsPopupVisible(true) mais on a une alors exception
    Zut et Gfx qui est partit vagabonder sur les routes des USA.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    merci beaucoup pour le code j'au rais jamais été capable de sortir un truc pareil ... même avec ça j'ai encore un peu de mal à vraiment cerné le problème. C'est quand même un truc de dingue pour une chose pas si compliqué que ça finalement.

    J'ai donc intégré tout ton code dans mon interface et ça marche plutot bien mais j'ai un petit bug d'affichage quand je clique sur la combobox et que je ne selectionne pas une entrée. Mais bon c'est pas grave si ya que ça ... j'ai d'autres choses plus importantes à faire.

    Pour l'instant j'essaye d'adapter ton code au miens pour pouvoir utiliser les données extraites de ma base ... je te tiens au courant de l'avancement

    et merci encore

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    re bonjour,

    bon j'ai encore quelques petits problèmes que je n'arrive pas à résoudre

    1/
    j'ai mes combobox qui s'affichent mais au lieu de se mettre sur la colonne 0 elle se mettent sur la colonne 1. j'ajoute pourtant bien avec cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    model.addRow(new Object[] {rows.get(i).getXMLLocation(), locs});

    rows est un arraylist qui contient un objet qui stock les données d'une ligne à savoir la ville que je cherche (le 1er parmètre, qui est sous forme de String) et la liste des villes suceptibles de correspondre qui se présente sous la forme d'un tableau d'objet Location qui eux représentent une ville.
    Je lui passe donc locs en paramètre.

    je ne comprneds pas trop pourtant j'ai modifier mon code en conséquence pour reprendre les mêmes méthodes que toi sauf le type d'objet qui n'est pas de type Val



    2/
    quand je veux éditer une combobox elle prend toute la taille de mon panel et se met par dessus la tabme avec une flêche énorme. Et là je ne vois pas d'où ça vient .Est ce que ce serait par hasard le faite que je définisse le renderer et l'éditor dans mon Listener pour les cliques sur un fichier de l'arbre ? Et non dans la classe de mon arbre ?


    3/ la colonne qui est sensé afficher la combobox n'affiche que le type de l'objet passé. C'est à dire un Location[] mais c'est normal vu que c'est ce que je lui passe.


    Enfin là entre le 1/ et le 2/ qui doivent etre corélé j'ai dume planter quelques part dans l'interprétation de ton exemple avec l'enum. Je sais que c'est un problème de type d'objet qui est pas le bon mais je vois pas ou ... si tu pouvais m'éclairer merci. je vais continuer à regarder de mon côté.


    donc je te met mon code au cas ou :
    voilà ma classe qui défini la table


    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
    138
    139
    140
    141
     
     
    public class LocationTable extends JTable{
     
    	  /** The pseudo database.
               */
     
    	public static Map<Integer, java.util.List<Location>> DATA_BASE;
     
    	public LocationTable(){
    		super();
     
    		DefaultTableModel tableModel = new DefaultTableModel() {
    		      /** {@inheritDoc}
                           */
    		      @Override public Class getColumnClass(int i) {
    				  if (i == 1) {
    					  return Location.class;
    		        }
    		        return String.class;
    		      }
    		    };
     
     
    	    this.setModel(tableModel);	
    		tableModel.setColumnCount(2);
    	    tableModel.setColumnIdentifiers(new Object[] {"Name", "Choice"});
     
    	}
     
    	  /** The combo box table cell editor.
               */
    	  public static class ComboTableCellEditor extends DefaultCellEditor {
    	    private DataBaseQuerySystem dbConnect;
    		//private ArrayList <NewsLocationRow> rows;
     
    		public ComboTableCellEditor(DataBaseQuerySystem dbConnect) {
    			super(new JComboBox());
    			this.dbConnect = dbConnect;
     
     
     
    		}
     
    		/**
                     * {@inheritDoc}
                     */
    		@Override
    		public Component getTableCellEditorComponent(JTable table,
    				Object value, boolean isSelected, int row, int column) {
    			Component editor = super.getTableCellEditorComponent(table, value,
    					isSelected, row, column);
    			JComboBox combo = (JComboBox) getComponent();
    			combo.removeAllItems();
    			System.out.println("query for row" + row);
     
    			java.util.List<Location> authorizedValues = dbConnect.getAuthorizedValuesForRow(row);
    			for (Location authorizedValue : authorizedValues) {
    				combo.addItem(authorizedValue);
    			}
    			combo.setSelectedItem(value);
    			return editor;
    		}
     
    		public java.util.List<Location> getAuthorizedValuesForRow(int row) {
    		      return DATA_BASE.get(row);
    		  }
    	}
     
     
    	  /**
                     * Create the pseudo data base.
             * @param rows 
                     * 
                     * @return The pseudo data base.
                     */
    	  public static Map<Integer, List<Location>> createDataBase(ArrayList<NewsLocationRow> rows) {
     
    		//associe indice de la ligne => Liste des mots extraits de la base
    	    Map<Integer, java.util.List<Location>> resultMap = new HashMap<Integer, java.util.List<Location>>();
     
     
    		int i = 0;
    		// pour chaque ligne du tableau
    		for (NewsLocationRow rowObject : rows) {
     
    			java.util.List<Location> list = new ArrayList<Location>(rowObject.getDataBaseLocation().length);
     
    			Location[] resultLocs = rowObject.getDataBaseLocation();
     
    			//on ajoute les locations de la base dans une list
    			for (Location resultLoc : resultLocs) {
    				list.add(resultLoc);
    			}
     
    			//on la met dans la map avec son indice dans la table en clé
    			resultMap.put(i,Collections.unmodifiableList(list));
    			i++;
     
    		}
     
    		return Collections.unmodifiableMap(resultMap);
    	  }
     
     
     
    	  /** The combo box table cell renderer.
               */
    	  public static class ComboTableCellRenderer extends JComboBox implements TableCellRenderer {
    	    /** {@inheritDoc}
                 */
    	    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    	        setForeground(table.getSelectionForeground());
    	        setBackground(table.getSelectionBackground());
    	      } else {
    	        setForeground(table.getForeground());
    	        setBackground(table.getBackground());
    	      }
    	      removeAllItems();
    	      if (value != null) {
    	        addItem(value);
    	      }
    	      setSelectedItem(value);
    	      return this;
    	    }
    	  }
     
     
     
    	  /** Query data base.
               */
    	  public static class DataBaseQuerySystem {
    	    /** Query the data base.
                 * @param row Current row.
                 * @return A list of authorized values.
                 */
    	    public java.util.List<Location> getAuthorizedValuesForRow(int row) {
    	      return DATA_BASE.get(row);
    	    }
    	  }
    }

    et là c'est le code intéressant du mouseListener de mon Jtree qui parse le fichier set le renderer et l'editor et remplie le tableau avec la ville extraites du fichier et les villes suceptibles de lui correspondrent en 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
     
    SAXParser Parser = new SAXParser(node.getFilePath());
     
    				//les villes extraites du fichier 
    				ArrayList <String> locations = Parser.getLocationList();
     
    				//TODO mettre un RowBuilder qui initialise les lignes avec différent param
    				//e.g. car avec tout ça va etre un peu gros dans la methode
     
    				//le builder qui créé les objets de type ligne
    				RowBuilder builder = new RowBuilder(locations);
     
    				ArrayList <NewsLocationRow> rows = builder.buildRows();
     
     
    				//extraits les variables qui servent aux combobox
    				//on lui passe les lignes
    				LocationTable table = MainFrame.locationTable;
    				//construit la table de ma base
    				LocationTable.DATA_BASE = LocationTable.createDataBase(rows);
     
    				DefaultTableModel model = (DefaultTableModel) table.getModel();
     
    				table.setDefaultRenderer(String.class, new ComboTableCellRenderer());
    				table.setDefaultEditor(String.class, new ComboTableCellEditor(new DataBaseQuerySystem()));
     
    				//si la table n'est pas vide on l'efface
    				if(model.getRowCount()!= 0){
     
    					int i = model.getRowCount();
     
    					for (int j = 0; j < i; j++) {
    						model.removeRow(i);
    					}
    				}
     
    				//on ajoute les éléments
    				int i;
    				for (i = 0; i < rows.size(); i++) {
    					//decomposition de l'objet qui représente une ligne
    					NewsLocationRow rowObject = rows.get(i);
    					Location[] locs = rowObject.getDataBaseLocation();
    					String XMLlocation = rowObject.getXMLLocation();
     
    					model.addRow(new Object[] {rows.get(i).getXMLLocation(), locs[1]});
    				}

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    1) Il manque le code ou tu mets l'éditeur et le renderer sur la table mais si tu les affectes à la classe Location c'est tout à fait normal qu'ils soient affichés sur la 2nd colonne à cause de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override public Class getColumnClass(int i) { 
      if (i == 1) { 
         return Location.class; 
      } 
      return String.class; 
    }
    Puisque cette methode indique que c'est la 2nde colonne qui contient des objets de type Location

    2) Euh là franchement je ne sais pas, je n'ai jamais expérimenté ce pb.

    l'éditor dans mon Listener pour les cliques sur un fichier de l'arbre ? Et non dans la classe de mon arbre ?
    Arbre ???? je croyais qu'on parlais d'une table.

    3) Voir 1)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    1/
    Mais en faite je les affectent à mon model dans mon MouseListener car avant je ne connais pas les données à mettre dans les combo ni dasn la première colonne d'ailleurs.
    je suis d'accord que niveau architecture c'est peut etre pas terrible :s
    ah oui j'ai mis 0 à la place de 1 dans le if et ça marche . Mais je comprends pas trop c'est pourtant le deuxième objet que je passe qui est de type Location.

    2/ euh oui tu as raison c'est table pour le deuxième arbre
    sinon quand je clique sur le header de la table ou que je clique sur les lignes celà revient correctement. N'y a t'il pas une méthode qui permettrait de raffraichir l'affichage de la table comme dans ce cas ?

    ça sera la méthode barbare mais ce sera mieux que rien en attendant mieux.

    3/ euh oui je me suis emmelé c'était ça que je voulais dire


    4/et sinon je souhaite mettre un bouton dans la table. Est ce qu'il faut aussi que je définisse un renderer ou pas ?



    en tous cas merci beaucoup pour ta patience

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    oui de retour sur 1/ en effet je ne sais pas pourquoi je n'ai pas laisser l'affectation du renderer et de l'editor dans le constructeur. j'ai fait un mix pa s tres joli. c'est d'ailleurs là que se trouvait mon erreur en effet j'avais mal compris. j'avais laissé String de quand j'avais testé avec tes valeurs.
    j'ai donc remis ces lignes corrigées dans le constructeur de ma table.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.setDefaultRenderer(Location.class, new ComboTableCellRenderer());
    		this.setDefaultEditor(Location.class, new ComboTableCellEditor(new DataBaseQuerySystem()));

  20. #20
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ok désolé je ne savais pas les types de rows.get(i).getXMLLocation() et de locs j'ai donc mal supposé. Donc la methode retourne une String (colonne 0) et locs est de type Location (colonne 1).
    Arf quel mix, je suis perdu.... lol

    Oui je crains qu'il ne faille à nouveau te définir un renderer et un editor.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2010] Combo box dans table ou formulaire?
    Par ultima67 dans le forum Modélisation
    Réponses: 2
    Dernier message: 15/10/2012, 22h16
  2. [MySQL] Sauver valeur de Combo Box dans une session PHP
    Par Namson dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/08/2010, 10h34
  3. Check box dans une JTable
    Par Mischka dans le forum Composants
    Réponses: 1
    Dernier message: 24/07/2007, 13h58
  4. Combo box dans barre d'outils
    Par guen dans le forum Access
    Réponses: 3
    Dernier message: 18/06/2006, 14h35
  5. Réponses: 11
    Dernier message: 24/01/2006, 10h20

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