IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JTable mettre les colonnes en couleur


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 42
    Par défaut JTable mettre les colonnes en couleur
    Bonjour à tous!

    Alors je précise d'entrée avant qu'on me lapide , J'ai énormément fait de recherche mais je ne trouve pas mon problème. Pourtant j'ai appliqué la solution de tous les forums et autre cours que j'ai croisé mais pas moyen!
    Voila je veux mettre les lignes de ma Table en une couleur selon la valeur d'une case de cette colonne.

    Je vous montre mon code:

    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
     
     
    private class ModeleTable extends AbstractTableModel{
     
            private final FilDeDiscussion f;
     
            public ModeleTable(FilDeDiscussion f){
                this.f=f;
            }
            @Override
            public int getRowCount() {
                if(f==null)
                    return 0;
                else
                    return f.getMessages().size();
            }
     
            @Override
            public int getColumnCount() {
                return 5;
            }
     
            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {              
                Message messageCourant=null;
                int i=0;
                for(Message a : f.getMessages()){
                    if(i==rowIndex)
                        messageCourant=a;
                    i++;
                }
     
                switch(columnIndex){
                    case 0: return messageCourant.getAuteur().getPrenom();
                    case 1: return messageCourant.getAuteur().getNom();
                    case 2: return messageCourant.getAuteur().getIdentifiant();
                    case 3: return messageCourant.getDate().toString();
                    case 4: return messageCourant.getContenu();
                    default: return null;
                }
     
            }
     
            @Override
            public String getColumnName(int i){
                switch (i){
                    case 0: return "Prénom";
                    case 1: return "Nom";
                    case 2: return "Identifiant";
                    case 3: return "Date";
                    case 4: return "Message";
                    default: return null;
                }
            }
     
     
     
        }
     
     
       public class CustomTableCellRenderer extends DefaultTableCellRenderer{
     
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                Message m;
                m = retourneMessage((String)table.getValueAt(row, 2),(String)table.getValueAt(row, 1),(String)table.getValueAt(row, 3),(String)table.getValueAt(row, 4));
                switch(m.getStatusMessage()){
                    case NON_RECU: c.setBackground(new Color(220,220,220));
                    case EN_ATTENTE: c.setBackground(new Color(250,80,80));
                    case RECU: c.setBackground(new Color(255,210, 135));
                    case LU: c.setBackground(new Color(80,250,80));
                    default: c.setBackground(new Color(80,250,80));
                }     
                setOpaque(true);
                return c;
     
            }
        }
     
     
     
     
     
        private void creerTableau(FilDeDiscussion fdd){
            JTable table= new JTable( new ModeleTable(fdd));
            TableCellRenderer renderer;
            renderer = new CustomTableCellRenderer();
            try {
                table.setDefaultRenderer( Class.forName( "java.lang.String" ), renderer );
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(InterfaceUtilisateur.class.getName()).log(Level.SEVERE, null, ex);
            }
            table.getColumnModel().getColumn(4).setPreferredWidth(500);
            jScrollPane5.setViewportView(table);
     
        }
    Et voici le resultat:

    Nom : Capture du 2018-01-14 23-43-35.png
Affichages : 437
Taille : 293,5 Ko

    Voila, comme vous voyez la couleur ne change pas, grosse galère...

    Merci pour votre aide!!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu associes le renderer avec la class String alors que ton modèle n'indique pas de colonne de cette classe (par défaut la classe est Object), via la méthode getColumnClass(). Tu pourrais également affecter le renderer directement sur les colonnes au lieu de passer par des renderers de type (table.getColumnModel().getColumn(1).setCellRenderer(new ExempleCellRenderer()); pour le mettre sur la colonne 0). Attention, pour avoir la ligne entière en couleur, il te faut bien sûr affecter le renderer à chaque colonne de la table, ou à tous les types affichables.

    Tu n'est pas obligé de faire un Class.forName pour obtenir une classe : table.setDefaultRenderer( String.class, renderer );. Cela t'évitera en plus ce catch un peu absurde.

    Par ailleurs, plutôt que de procéder dans getTableCellRendererComponent, ce qui risque de produire des conflits avec la gestion normal de la couleur dans une JTable (en particulier avec la sélection), il vaut mieux procéder soit par setter (setBackground()) quand la couleur n'est pas variable, soit par setValue() quand elle l'est comme dans ton cas. Sinon, il faudrait que tu reproduise tout le mécanisme déjà implémenté dans le DefaultTableCellRenderer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override
    protected void setValue(Object value) {
        super.setValue(value);
        Message m = retourneMessage((String)table.getValueAt(row, 2),(String)table.getValueAt(row, 1),(String)table.getValueAt(row, 3),(String)table.getValueAt(row, 4));
        switch(m.getStatusMessage()){
            case NON_RECU: setBackground(new Color(220,220,220));
            case EN_ATTENTE: setBackground(new Color(250,80,80));
    	case RECU: setBackground(new Color(255,210, 135));
            case LU: setBackground(new Color(80,250,80));
            default: setBackground(new Color(80,250,80));
        }      
    }
    Si la variable table n'est pas dans la portée lorsque tu crées le renderer, ou si ton renderer est multi table (réutilisable), tu peux aussi le faire dans getTableCellRendererComponent, mais en agissant sur le renderer, pas le composant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    					boolean hasFocus, int row, int column) {
    Message m = retourneMessage((String)table.getValueAt(row, 2),(String)table.getValueAt(row, 1),(String)table.getValueAt(row, 3),(String)table.getValueAt(row, 4));
    switch(m.getStatusMessage()){
            case NON_RECU: setBackground(new Color(220,220,220));
            case EN_ATTENTE: setBackground(new Color(250,80,80));
    	case RECU: setBackground(new Color(255,210, 135));
            case LU: setBackground(new Color(80,250,80));
            default: setBackground(new Color(80,250,80));
    }      
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
    Et utilise plutôt des constantes ou au moins des variables de classes pour les couleurs, sinon tu vas créer plein d'objets de type Color inutilement.

    Exemples ici :
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [OL-2010] Mettre les weekends en couleur
    Par coqrya dans le forum Outlook
    Réponses: 1
    Dernier message: 09/04/2013, 23h43
  2. Réponses: 6
    Dernier message: 08/07/2011, 16h22
  3. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  4. Mettre une colonne en couleur dans un form datasheet
    Par le lynx dans le forum Access
    Réponses: 3
    Dernier message: 24/05/2006, 16h17
  5. [JTable] Changer les colonnes de manière dynamique
    Par gg2laba dans le forum Composants
    Réponses: 3
    Dernier message: 03/10/2005, 23h39

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