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] Modifier la couleur d'une cellule


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut [JTable] Modifier la couleur d'une cellule
    bonjour,


    je cherchais un moyen de modifier la couleur d'une ligne d'un JTable. J'ai donc utilisé le TableCellRenderer. Le programme fonctionne très bien, mais comme je débute dans le langage il y a des choses qui m'échappent complètement

    Ma fenêtre contient un JTable avec 8 lignes (sans compter la ligne des titres), un JButton et un JComboBox qui contient des nombres allant de 1 à 8.

    ma classe principale (j'utilise Netbeans)
    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 myTable extends javax.swing.JFrame
    {
        private myCellRenderer cr = new myCellRenderer();
     
        /** Creates new form myTable */
        public myTable()
        {
            int i;
            initComponents();
     
            for (i=0; i<this.jTable1.getColumnCount(); i++)
                this.jTable1.getColumnModel().getColumn(i).setCellRenderer(cr);
     
            this.jTable1.setRowSelectionAllowed(false);
        }
     
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                         
        {                                             
            int index;
            index = this.jComboBox1.getSelectedIndex();
            this.cr.setRowColor(index, Color.CYAN);
     
            this.jTable1.repaint();
        } 
     
        private void initComponents() 
        {
          ...................
     
        }
     
     
        /**
        * @param args the command line arguments
        */
        public static void main(String args[])
        {
            java.awt.EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    new myTable().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        private javax.swing.JComboBox jComboBox1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTable jTable1;
        // End of variables declaration
    et mon TableCellRenderer
    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
     
     
    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
     
     
    public class myCellRenderer extends DefaultTableCellRenderer
    {
        private int numRow;
        private Color rowColor;
     
        public myCellRenderer()
        {
            super();
            super.setOpaque(true);
     
            numRow = -1;
            rowColor = Color.WHITE;
        }
     
        public void setRowColor(int row, Color color)
        {
            numRow = row;
            rowColor = color;
        }
     
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column)
        {
     
            Component cell = super.getTableCellRendererComponent(table,  value,
                    isSelected, hasFocus, row, column);
            if (row==numRow)
            {
                cell.setBackground(rowColor);
                //System.out.println("ok");
            }
            else
            {
                cell.setBackground(Color.WHITE);
            }
     
            return cell;
        }
     
    }
    avec la fonction setRowColor() je peux affecter à une ligne de mon JTable une couleur.

    Ce que je comprends pas c'est au niveau de getTableCellRendererComponent().
    Si le numéro de ligne est égal au numéro de ligne que j'ai sélectionné, je change la couleur du fond.

    Si je mets le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            else
            {
                cell.setBackground(Color.WHITE);
            }
    j'obtiens bien ce que je souhaite (screen.jpg) par contre si je ne mets pas le else j'obtiens tout autre chose (screen2.jpg).

    - Pourquoi est-ce que je suis obligé de préciser pour les lignes qui suivent celle que j'ai sélectionnée la couleur du fond, c'est à dire WHITE ?
    C'est comme si finalement le setBackground() était à la fois valable pour la ligne sélectionnée mais aussi pour les autres....

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Quand tu vas afficher ton tableau, ce dernier va appeler la méthode getTableCellRendererComponent() pour chaque cellule (le tableau n'utilisera pas ce que tu as créé autour (numrow, rowcolor, ...) sauf si tu les utilises dans la méthode citée avant.

    En paramètre de cette méthode, tu retrouves :
    JTable table : la table elle même
    Object value : l'objet contenu dans la cellule
    boolean isSelected : est-ce que la cellule est sélectionnée
    boolean hasFocus : est-ce que la cellule a le focus
    int row : ligne où se trouve l'objet
    int column : colonne où se trouve l'objet

    c'est ensuite à partir de ces valeurs que tu vas pouvoir gérer le comportement de ta cellule.

    Si tu veux lui changer la couleur lorsqu'elle est sélectionnée (ce que à priori tu cherches à faire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(isSelected){
          cell.setBackground(couleur si sélectionné);
    else{
          cell.setBackground(couleur si non sélectionné);
    }

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    mais pourquoi le else est nécessaire ?

    Pour moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (row==numRow)
            {
                cell.setBackground(rowColor);
                //System.out.println("ok");
            }
    est amplement suffisant. Mais si je ne mets pas le else, les lignes en dessous que celle sélectionnée sont aussi colorée. Pourquoi ?

  4. #4
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Parce que la réponse se trouve dans ce qui est dit plus haut

    Quand tu vas afficher ton tableau, ce dernier va appeler la méthode getTableCellRendererComponent() pour chaque cellule (le tableau n'utilisera pas ce que tu as créé autour (numrow, rowcolor, ...) sauf si tu les utilises dans la méthode citée avant.
    Implementation Note éclaircit la chose et donc le else permet de définir le rendu pour les cellules non concernées.

  5. #5
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Si j'ai bien compris la doc :
    si je modifie le rendu pour une cellule, celui-ci est utilisé comme tampon pour redessiner les autres cellules sauf si je spécifie un nouveau rendu (grâce au else).

    Du coup je me pose cette question : si à chaque à appel de getTableCellRendererComponent() je redéfinis un rendu qui est toujours le même (dans le cas du else), est-ce que je perds en performance ?

    Car je pourrais sans doute définir un rendu 1 seule fois pour chaque ligne par exemple :
    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
     
    @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column)
        {
     
            Component cell = super.getTableCellRendererComponent(table,  value,
                    isSelected, hasFocus, row, column);
     
     
     
            if (row==numRow && column==0)
            {
                cell.setBackground(rowColor);
                System.out.println("Rendu 1");
            }
     
            if (row<numRow && column==0 || row>numRow && column==0)
            {
                cell.setBackground(Color.WHITE);
                System.out.println("Rendu 2");
            }
     
            System.out.println(row + " " + column);
     
            return cell;
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing] Modifier la couleur d'une cellule de JTable
    Par ekahrd dans le forum Composants
    Réponses: 3
    Dernier message: 08/03/2012, 16h22
  2. Modifier la couleur d'une cellule
    Par karkass59 dans le forum Excel
    Réponses: 2
    Dernier message: 07/04/2008, 10h46
  3. Comment modifier la couleur d'une cellule d'un TStringgrid
    Par francois.delpierre dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/11/2007, 12h38
  4. [Word97 / Delphi6] Comment modifier la couleur d'une cellule ?
    Par Lolo1988 dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 29/10/2007, 10h48
  5. [JTable] Changer la couleur d'une cellule
    Par Freak49 dans le forum Composants
    Réponses: 1
    Dernier message: 06/10/2005, 18h11

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