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 :

Création de tableaux (JTable) avec Swing [Tutoriel]


Sujet :

Composants Java

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut Création de tableaux (JTable) avec Swing
    Bonsoir,

    Je viens de finir un tutoriel Java sur Swing : Création interface graphique avec Swing : les tableaux (JTable)

    Je tente d'expliquer les différents concepts liés à l'utilisation de tableaux en Swing. Dans cet article, nous verrons donc les concepts de base du composant JTable, la définition de modèle de tableaux, la modification dynamique du contenu du tableau, la façon de modifier l'affichage des différentes cellules du tableau, la modification directe du contenu du tableau et finalement le tri et le filtrage du tableau.

    En espérant qu'il vous soit utile

    Baptiste Wicht

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Points : 1 267
    Points
    1 267
    Par défaut
    Pas mal de fonctionnalité, avec du bon code réutilisable. Beau travail !

    J'en profite quand même pour réintroduire mon vieil article sur les JTables, plus court, et différent (moins de fonctionnalités, et un poil plus de TableColumn et Events).

    J'adore la programmation Swing, c'est très agréable à programmer. Dommage que ce soit obsolète pour x raisons étranges.

  3. #3
    Membre averti Avatar de vintz72
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 154
    Points : 316
    Points
    316
    Par défaut
    Citation Envoyé par nicorama Voir le message
    Pas mal de fonctionnalité, avec du bon code réutilisable. Beau travail !
    [...]
    J'adore la programmation Swing, c'est très agréable à programmer. Dommage que ce soit obsolète pour x raisons étranges.
    Bien d'accord pour le premier point.
    Pour le second... bof. J'avoue que je m'y suis habitué, et il y a des aspects sympas, mais en somme, je trouve quand même plutôt lourd le Swing. Il faut souvent parcourir plusieurs objets avant d'obtenir une information triviale (ex récent pour moi: je voulais définir un renderer spécial sur une colonne donnée. Le faire pour une classe donnée n'était pas possible étant donné que plusieurs colonnes sont de type "Date". Et bien il faut éplucher la Javadoc pour trouver qu'il faut passer par le TableModel pour récupérer la bonne colonne ! J'ai eu des exemples pires, mais je ne me rappelle plus en détail). En outre, il manque une vision haut niveau du paradigme MVC. J'utilise un framework propriétaire pour palier cela, mais de base, Swing, ça manque quand même de beaucoup de choses.
    A sa décharge, il est vrai qu'il est plus ou moins abandonné par Sun au profit de JavaFX... le même tutoriel (sur les JTable) avec ce dernier serait intéressant !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Points : 11
    Points
    11
    Par défaut un grand merci
    Bonjour,

    Pour mon projet, je galère un peu avec ces fameuses jTable ;o)

    Bon boulot !

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Merci
    Merci pour l'article.

    La lecture du code source de la démo Swing fourni avec le JDK est aussi intéressante. C'est aussi dispo en Web Start sur : https://swingset3.dev.java.net .

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Très bon article sur les JTables ! Cela manquait



    J'ai deux petites remarques (mais c'est vraiment des bricoles --- j'aime bien chipoté ) :


    Tu peux éviter de supprimer le texte des cellule avec setText("") tout simplement en évitant de passer "value" à la méthode parente, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class ColorCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);
            setBackground( (Color)value );
            return this;
        }
    }



    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		setFont(this.boldFont);
    		return this;
    	}
    }




    Enfin je finirais avec une petite astuce : il est possible d'alterner les couleurs de fond des cellules assez facilement. Par example pour alterner avec un jaune pale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UIManager.put("Table.alternateRowColor", new Color(255, 255, 204));
    Cela fonctionne tant qu'on ne modifie pas explicitement la couleur de fond et qu'on hérite bien de DefaultCellRenderer pour tous nos renderer (ce que je conseillerais d'ailleurs pour la plupart des renderers).

    Toutefois, il faut penser que cela impactera toutes les JTables de l'application...


    a++

  7. #7
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Merci pour vos commentaires

    Citation Envoyé par adiGuba Voir le message
    Tu peux éviter de supprimer le texte des cellule avec setText("") tout simplement en évitant de passer "value" à la méthode parente, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class ColorCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, null, isSelected, hasFocus, row, column);
            setBackground( (Color)value );
            return this;
        }
    }
    C'est pas con, j'y avais même pensé

    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		setFont(this.boldFont);
    		return this;
    	}
    }
    Très juste, j'avais oublié ça moi

    Enfin je finirais avec une petite astuce : il est possible d'alterner les couleurs de fond des cellules assez facilement. Par example pour alterner avec un jaune pale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UIManager.put("Table.alternateRowColor", new Color(255, 255, 204));
    Cela fonctionne tant qu'on ne modifie pas explicitement la couleur de fond et qu'on hérite bien de DefaultCellRenderer pour tous nos renderer (ce que je conseillerais d'ailleurs pour la plupart des renderers).

    Toutefois, il faut penser que cela impactera toutes les JTables de l'application...

    a++
    Je vais l'inclure dans une section Divers, merci

    Je vais mettre à jour dans les jours qui viennent

  8. #8
    Membre habitué

    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    149
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 149
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par vintz72 Voir le message
    Pour le second... bof. J'avoue que je m'y suis habitué, et il y a des aspects sympas, mais en somme, je trouve quand même plutôt lourd le Swing. Il faut souvent parcourir plusieurs objets avant d'obtenir une information triviale (ex récent pour moi: je voulais définir un renderer spécial sur une colonne donnée. Le faire pour une classe donnée n'était pas possible étant donné que plusieurs colonnes sont de type "Date".
    Pas faux, ceci dit c'est aussi ce qui en fait sa puissance, on peut faire énormément de choses avec. Pour quelque chose de trivial si on ne connaît il faut certes chercher un peu (et encore avec la javadoc c'est facile), mais après on est bien content lorsqu'on veut quelque chose de vraiment "sur mesure".

    Citation Envoyé par vintz72 Voir le message
    En outre, il manque une vision haut niveau du paradigme MVC. J'utilise un framework propriétaire pour palier cela, mais de base, Swing, ça manque quand même de beaucoup de choses.
    Heu déjà pourquoi veux-tu une vision haut niveau ? Ce sont des éléments de bas niveau justement... le haut niveau c'est ton application, pas les composants. De toute façon la plupart des composants n'utilisent pas le pattern MVC qui pour toute une série de raisons n'est pas approprié à ce niveau-ci d'abstraction, mais bien un modèle-vue où le contrôleur et la vue ont été couplées. Bon heu... je n'ai peut-être pas compris ta remarque non plus


    Sinon j'applaudis l'idée de ce tuto déjà pas mal complet. Vu le temps que j'ai dû passer plongé dans la javadoc et dans les tutos Sun pour apprendre à correctement m'en servir... ça pourra sûrement en aider plus d'un !

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Quelques remarques
    Merci , c'est un bon travail
    mais svp il manque un peu d'organisation de code, il faut indiquer où mettre chaque bout de code car ils sont séparés, et concernant le code de triage il n'a pas bien marché
    de même pour la modification de valeur de combobox de sport ;
    j'attends la modification de code

  10. #10
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par mysina.25 Voir le message
    Merci , c'est un bon travail
    mais svp il manque un peu d'organisation de code, il faut indiquer où mettre chaque bout de code car ils sont séparés, et concernant le code de triage il n'a pas bien marché
    de même pour la modification de valeur de combobox de sport ;
    j'attends la modification de code
    L'entier du code est téléchargeable au dernier chapitre. Ce serait trop lourd d'inclure à chaque fois le code entier. Il me semble dèja que les explications sur l'inclusion du code sont suffisamment claires. Je vais encore essayer d'améliorer cela pour la prochaine version de l'article.

  11. #11
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Dans ton SexeCellRenderer tu précharges une fois pour toute les images pour éviter de les recréer à chaque appel. C'est bien mais on pourrait faire la même chose dans le BoldCellRenderer pour éviter de multiplier les créations de Font dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class BoldCellRenderer extends DefaultTableCellRenderer {
     
    	private final Font boldFont = getFont().deriveFont(Font.BOLD);
    Bonjour,
    pour chipoter un peu...
    C'est une bonne idée mais il faut être conscient que cela a des effets de bord ; en effet ici tu crées une fonte à partir de la fonte par défaut associée au JLabel (puisque DefaultTableCellRenderer hérite de JLabel). Or DefaultTableCellRenderer est initialement configuré pour "hériter" de la fonte de la JTable, ce qui n'est plus le cas ici. Ainsi, si la fonte de la JTable est modifiée, le BoldCellRenderer gardera la fonte initialement calculée. De plus il peut être problématique de partager le BoldCellRenderer entre différentes tables (de fonte différente).

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 59
    Points : 26
    Points
    26
    Par défaut
    Hello merci beaucoup pour ton tuto

    juste pour écrire moins avec des classes anonymes pour ceux qui les aiment c'est pas vraiment utile mais je trouve ça plus claire... :
    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
    public class JTableBasiqueAvecPanelAvecScrollPaneEtModeleObjectDynamique extends javax.swing.JFrame {
        private ModeleObjectDynamique modele = new ModeleObjectDynamique();
        private JTable tableau = new JTable(modele);
     
        public JTableBasiqueAvecPanelAvecScrollPaneEtModeleObjectDynamique(){
            setTitle("JTable avec modèle dynamique");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
            JPanel boutons = new JPanel();
     
            boutons.add(new JButton(new AbstractAction("Ajouter") {
                public void actionPerformed(ActionEvent e) {
                    modele.addAmi(new Ami("Megan", "Sami", Color.green, false, Sport.NATATION));
                }
            }));
     
            boutons.add(new JButton(new AbstractAction("Supprimmer") {
                public void actionPerformed(ActionEvent e) {
                    int[] selection = tableau.getSelectedRows();
     
                    for(int i = selection.length - 1; i >= 0; i--){ modele.removeAmi(selection[i]);}
                }
            }));
     
            getContentPane().add(boutons, BorderLayout.SOUTH);
     
            pack();
        }
    à la place 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
    public class JTableBasiqueAvecModeleDynamiqueObjet extends JFrame{
        private ModeleDynamiqueObjet modele = new ModeleDynamiqueObjet();
        private JTable tableau;
     
        public JTableBasiqueAvecModeleDynamiqueObjet() {
            super();
     
            setTitle("JTable avec modèle dynamique");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            tableau = new JTable(modele);
     
            getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
            JPanel boutons = new JPanel();
     
            boutons.add(new JButton(new AddAction()));
            boutons.add(new JButton(new RemoveAction()));
     
            getContentPane().add(boutons, BorderLayout.SOUTH);
     
            pack();
        }
     
        public static void main(String[] args) {
            new JTableBasiqueAvecModeleDynamiqueObjet().setVisible(true);
        }
     
        private class AddAction extends AbstractAction {
            private AddAction() {
                super("Ajouter");
            }
     
            public void actionPerformed(ActionEvent e) {
                modele.addAmi(new Ami("Megan", "Sami", Color.green, false, Sport.NATATION));
            }
        }
     
        private class RemoveAction extends AbstractAction {
            private RemoveAction() {
                super("Supprimmer");
            }
     
            public void actionPerformed(ActionEvent e) {
                int[] selection = tableau.getSelectedRows();
     
                for(int i = selection.length - 1; i >= 0; i--){
                    modele.removeAmi(selection[i]);
                }
            }
        }
    }
    PS : ça marchera pas avec un copier/coller je me suis approprié les noms et j'ai fait un main séparé

  13. #13
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Effectivement, ça va aussi marcher très bien, même si personnellement, je trouve ça plus lourd comme syntaxe. Comme quoi, les goûts et les couleurs

    Sinon, la version avec les classes internes plutôt plutôt qu'anonyme a un avantage si on veut aussi permettre d'utiliser ces actions via un menu ou un raccourci clavier, ce qui n'est pas faisable avec une classe anonyme à moins de dupliquer du code.

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Points : 929
    Points
    929
    Par défaut
    quand tu ajoutes un élément, ton élément est statique... ce n'est pas l'utilisateur qui l'entre....

    comment tu ferais pour que ça soit l'utilisateur qui entre la ligne de donnée au complet?

    il y a ajout d'une ligne vide via un bouton... ou bien il y en a toujours une de vide... ensuite ajout des donnée de l'utilisateur ? ou ces changements seraient fait?

  15. #15
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par robert_trudel Voir le message
    quand tu ajoutes un élément, ton élément est statique... ce n'est pas l'utilisateur qui l'entre....

    comment tu ferais pour que ça soit l'utilisateur qui entre la ligne de donnée au complet?

    il y a ajout d'une ligne vide via un bouton... ou bien il y en a toujours une de vide... ensuite ajout des donnée de l'utilisateur ? ou ces changements seraient fait?
    Comme dit dans l'article, pour que les données entrées soit ajoutées par l'utilisateur et non pas de manière statique, il faudrait construire une vue pour ajouter un Ami. Typiquement, ce serait un JDIalog avec un champ par valeur de Ami avec deux boutons Ok et Annuller et le bouton OK prendrait les valeurs de la vue pour les ajouter dans le modèle du tableau.

    Sinon, une autre solution, comme tu l'as dit, un bouton pour rajouter une ligne vide et ensuite l'utilisateur fait les modifications directement dans le tableau, mais ce n'est pas à mon avis, le choix le plus ergonomique.

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    853
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 853
    Points : 929
    Points
    929
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Comme dit dans l'article, pour que les données entrées soit ajoutées par l'utilisateur et non pas de manière statique, il faudrait construire une vue pour ajouter un Ami. Typiquement, ce serait un JDIalog avec un champ par valeur de Ami avec deux boutons Ok et Annuller et le bouton OK prendrait les valeurs de la vue pour les ajouter dans le modèle du tableau.

    Sinon, une autre solution, comme tu l'as dit, un bouton pour rajouter une ligne vide et ensuite l'utilisateur fait les modifications directement dans le tableau, mais ce n'est pas à mon avis, le choix le plus ergonomique.
    pourquoi c'est le choix que la plupart des applications de gestions font...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut Super !
    Merci pour ce tuto qui m'a bien aidé

    j'ai quand même une question .... J'ai vue dans la doc de TableModel que la méthode getColumnName doit retourner une String. Hors je voudrais mettre une checkbox pour permettre de tout sélectionner ou pas. Je sais pas quoi faire, j'ai peur qu'on puisse pas. Auriez-vous une idée?

    Merci mec

  18. #18
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Oui, c'est possible. Tu peux spécifier un renderer pour les header.

    Un exemple ici : http://www.codeguru.com/java/articles/664.shtml

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    Super !! je vais regarder ca de plus près , merci

  20. #20
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Merci

Discussions similaires

  1. Importer une liste dans une JTable avec SWING
    Par samibipbip dans le forum Composants
    Réponses: 6
    Dernier message: 26/10/2011, 08h20
  2. Réponses: 0
    Dernier message: 09/05/2011, 15h50
  3. [Article] Création de tableaux (JTable) avec Swing
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 20/12/2009, 22h50

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