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]Définir à tout moment le background d'une cellule


Sujet :

Composants Java

  1. #1
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut [JTable]Définir à tout moment le background d'une cellule
    Bonjour,

    Je recherche une méthode permettant d'affecter une couleur à une cellule d'un JTable.
    J'ai épluché énormément de forum et de tuto mais à aucun moment je n'ai trouvé ce que je cherche.

    J'aimerai pouvoir, à tout moment, faire un table.setBgColorAt(int row, int col, Color c); et ne surtout pas avoir une condition fixe dans le "prepareRenderer" pour déterminer la couleur.

    j'ai trouvé ce genre de chose :
    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
    public TableColumnColor()
             {
             DefaultTableModel dtm = new DefaultTableModel(data,columnNames);
             JTable table=new JTable(dtm)
                 {
                 public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
                     {
                     Component component = super.prepareRenderer(renderer,row,column);
     
                     if(column == 0)
                         {
                         component.setBackground(Color.yellow);
                     }
                     if(column == 1)
                         {
                         component.setBackground(Color.red);
                     }
                     if(column == 2)
                         {
                         component.setBackground(Color.pink);
                     }
                     return component;
                 }
             };
     
             JScrollPane scroll=new JScrollPane(table);
             this.setContentPane(scroll);
             this.setBounds(100,50,300,150);
         }
    et c'est tout à fait ce dont il ne me faut pas
    Alors si quelqu'un à une idée.... Merci

  2. #2
    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
    Donc tu veut pouvoir changer à tout moment une couleur de cellule ?

    Le mieux, je pense, c'est d'avoir un tableau avec un couleur pour chaque case et un renderer qui se base sur ce tableau pour changer la couleur des cases.

  3. #3
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par wichtounet
    Donc tu veut pouvoir changer à tout moment une couleur de cellule ?

    Le mieux, je pense, c'est d'avoir un tableau avec un couleur pour chaque case et un renderer qui se base sur ce tableau pour changer la couleur des cases.
    Oui j'ai tester cela, mais quand je fais appel (apres la création) à la fonction setColorAt(...), ça ne fonctionne pas, en fait, la méthode que j'ai faite fonctionne à la création, mais si une fois le tableau créé, je veux changer la couleur d'une cellule, ça ne fonctionne pas.

    Voilà la classe dont je parle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    class LeTable extends JTable {
        public LeTable() {
            try {
                jbInit();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
     
        private Color[][] m_cBgColor;
        protected int m_iNbRow;
        protected int m_iNbCol;
        LeTable(Object[][] m_oDatas, String[] m_sTitres) {
            super(new LeTableModel(m_oDatas, m_sTitres));
            m_iNbRow = m_oDatas.length;
            m_iNbCol = m_sTitres.length;
            LeTableCellRenderer renderer = new LeTableCellRenderer();
            this.setDefaultRenderer(Object.class, renderer);
            this.setSelectionBackground(Color.YELLOW);
            this.setSelectionForeground(Color.BLUE);
            this.setGridColor(Color.black);
            this.setRowHeight(20);
            initColor();
        }
     
        protected void initColor() {
            m_cBgColor = new Color[m_iNbRow][m_iNbCol];
            for (int i = 0; i < m_iNbRow; i++) {
                for (int j = 0; j < m_iNbCol; j++) {
                    m_cBgColor[i][j] = Color.WHITE;
                }
            }
        }
     
        /**
         * setBackgroungColorAt
         *
         * @param c Color
         * @param row int
         * @param col int
         */
        public void setBackgroungColorAt(Color c, int row, int col) {
            m_cBgColor[row][col] = c;
        }
     
        private void jbInit() throws Exception {
        }
     
        class LeTableCellRenderer extends DefaultTableCellRenderer {
            public Component getTableCellRendererComponent(
                    JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int col) {
     
                Color BACKGROUND_SELECTED = Color.YELLOW;
                Color FOREGROUND_SELECTED = Color.BLUE;
                Color BACKGROUND = Color.WHITE;
                Color FOREGROUND = Color.BLACK;
     
                // on utilise le renderer super qui va tenir compte de
                // tout ce qu'on a besoin (sélection, focus)
                Component comp = super.
                                 getTableCellRendererComponent(
                                         table, value, isSelected, hasFocus, row,
                                         col);
                comp.setBackground(m_cBgColor[row][col]);
     
                if (isSelected) {
                    this.setBackground(BACKGROUND_SELECTED);
                    this.setForeground(FOREGROUND_SELECTED);
                    this.setHorizontalAlignment(JLabel.CENTER);
                } else {
                    //this.setBackground(BACKGROUND);
                    this.setForeground(FOREGROUND);
                    this.setHorizontalAlignment(JLabel.CENTER);
                }
     
                return this;
            }
        }
    }

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par krolineeee
    Oui j'ai tester cela, mais quand je fais appel (apres la création) à la fonction setColorAt(...), ça ne fonctionne pas, en fait, la méthode que j'ai faite fonctionne à la création, mais si une fois le tableau créé, je veux changer la couleur d'une cellule, ça ne fonctionne pas.
    Où est-ce que tu modifies ton tableau m_cBgColor?

  5. #5
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par seiryujay
    Où est-ce que tu modifies ton tableau m_cBgColor?
    là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setBackgroungColorAt(Color c, int row, int col) {
            m_cBgColor[row][col] = c;
        }

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ce que je voulais dire, c'est où est-ce que tu appelles cette méthode?

  7. #7
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Je l'appel lors de la création de mon jTable
    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
     
    for (int i = 0; i < 18; i++) {
                    if (m_oDatasTK[i][2].equals("Inactif")) {
                        table1.setBackgroungColorAt(new Color(255,62,62), i, 2);
                    } else {
                        table1.setBackgroungColorAt(new Color(112,221,106), i, 2);
                    }
                    if (m_oDatasTK[i][3].equals("Inactif")) {
                        table1.setBackgroungColorAt(new Color(255,62,62), i, 3);
                    } else {
                        table1.setBackgroungColorAt(new Color(112,221,106), i, 3);
                    }
                }

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Et tu ne l'appelles pas lorsque tu dois changer la couleur de ta cellule?
    Genre sur le clic sur la cellule ou sur la saisie d'une valeur entraînant un changement de couleur?

  9. #9
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par seiryujay
    Et tu ne l'appelles pas lorsque tu dois changer la couleur de ta cellule?
    Genre sur le clic sur la cellule ou sur la saisie d'une valeur entraînant un changement de couleur?
    Non en fait je crée mon tableau à partir de données issue d'une base, et la couleur dépend des données récoltées.
    Quand je le fait une fois, ça se passe nikel, seulement ces données changeant tres régulièrement, je dois permettre le rafraichissement de la fenetre. Quand je rafraichit, je relance donc la méthode qui rempli le tableau, les données sont effectivement modifiées mais les couleurs des cellules elles restent fixes....

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Question bête mais t'as vérifié dans la méthode getTableCellRendererComponent() que m_cBgColor[row][col]) avait bien la nouvelle valeur?

  11. #11
    Membre habitué Avatar de krolineeee
    Inscrit en
    Mars 2006
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 232
    Points : 173
    Points
    173
    Par défaut
    Citation Envoyé par seiryujay
    Question bête mais t'as vérifié dans la méthode getTableCellRendererComponent() que m_cBgColor[row][col]) avait bien la nouvelle valeur?
    Ok merci de ton aide mais l'erreur venait d'ailleur

    En fait je faisait un JScrollPane.add(montable); mais à aucun moment je faisait le remove, voilà erreur bete et méchante qui donne un résultat plutot troublant, j'ai passer 2 jours à me rendre compte de ça!
    Enfin merci de m'avoir aidé.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2014, 14h27
  2. Quitter un programme à tout moment à l'appuie d'une touche
    Par Bash01 dans le forum Général Java
    Réponses: 5
    Dernier message: 19/07/2011, 13h25
  3. sortir d'un programme à tout moment
    Par blabla06 dans le forum Windows
    Réponses: 3
    Dernier message: 04/06/2008, 14h14
  4. Sortir a tout moment d'une machine d'etats
    Par Jerepain dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/06/2007, 17h15
  5. Changer le background d'une cellule de JTable
    Par m@t dans le forum Composants
    Réponses: 8
    Dernier message: 27/11/2005, 17h28

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