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 :

Changer la couleur de fond cellule JTable


Sujet :

Composants Java

  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Changer la couleur de fond cellule JTable
    Bonjour, je vous donne 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
    package table;
     
    import javax.swing.table.DefaultTableCellRenderer;
    import java.awt.Component;
    import javax.swing.JTable;
    import java.awt.Color;
     
    public class cell_renderer extends DefaultTableCellRenderer { 
    	public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){ 
    		//Récupération du composant 
    		Component cell = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); 
     
    		//Modifier la couleur 
    		if(value.equals("1")) 
    				cell.setBackground(Color.GREEN); 
    		else if (value.equals("-1"))
    				cell.setBackground(Color.RED); 
     
    		//Renvoi du composant 
    		return cell; 
    	} 
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.setDefaultRenderer(table.getClass(), new cell_renderer());
    Ca ne marche pas et je ne vois pas pourquoi, pas d'erreurs...

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu mets des objets "table" dans ta "table" ?
    La méthode "setDefaultRenderer" associe un type d'objet (qui sera placé dans une JTable) avec un renderer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 71
    Par défaut
    Salut,

    si ta table contient des String, il faut appeler la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setDefaultRenderer(String.class,new cell_renderer());
    A+

  4. #4
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut MA TABLE
    J'ai essayé String.class, mais ca ne marche toujours pas.

  5. #5
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Help
    Je suis arrivé à a faire ca :

    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
    public void set_table_Salle(int nb_columns){
    		 model = getColumnModel();
     
    		 combo = new JComboBox();
    		 combo.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 16));
    		 combo.addItem("-1");
    		 combo.addItem("1");
    		 combo.addItem("2");
    		 combo.setBackground(new Color(225,30,125));
    		 combo.addItemListener(new java.awt.event.ItemListener() {
    				public void itemStateChanged(java.awt.event.ItemEvent e) {
    					combo_itemStateChanged(e);
    				}
    			});
     
    		 for(int i = 1;i<nb_columns;i++){
    			 table_column = model.getColumn(i);
    			 TableCellEditor tce = new DefaultCellEditor(combo);
    			 table_column.setCellEditor(tce);
     
    		 }
     
    	 }
    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
     
     private void combo_itemStateChanged(java.awt.event.ItemEvent e){
    		 if(e.getStateChange() == ItemEvent.DESELECTED){
    			JComboBox c = (JComboBox)e.getSource();
    			Color c1 = new Color(0,0,0);
    			Color c2 = new Color(255,255,255);
    			Color c3 = new Color(255,0,0);
    			 System.out.println( c.getParent());
    			 for(int i = 0;i < this.getColumnCount();i++){
    				 for(int j=0;j<this.getRowCount();j++){
    					 if(this.getValueAt(j, i).toString().compareTo("1") == 0){
    						// custom.setBackground(c1); 
    						 c.getParent().setBackground(c1);
    					 }
    					 else if(this.getValueAt(j, i).toString().compareTo("2") == 0){
    						 //custom.setBackground(c2);
    						 c.setBackground(c2);
    					 }
    					 else if(this.getValueAt(j, i).toString().compareTo("-1") == 0){
    						 //custom.setBackground(c3);
    						 c.setBackground(c3);
    						 //this.getColumnModel().getColumn(i).setCellRenderer(custom);
    					 }
    				 }
     
    			   }
    			 //custom.getTableCellRendererComponent(this, combo, false, true, 1, 1).setBackground(new Color(0,0,0));
    		 }
    	 }
    Mais ca me change la couleur de toutes les cellules du tableau, alors que je voudrai les changer selon leur valeu (-1 = bleu,2 = rouge, par exemple).

    Je suis sur que je ne suis pas loin, help plz

  6. #6
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    Salut !
    J'ai trouvé ce code quelque part ...
    En passant par un nouveau CellRenderer :

    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
     
    public class Couleur extends DefaultTableCellRenderer { 
        public Component getTableCellRendererComponent
                        (JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){
                                                                                                                    // Récupération de la cellule
            Component cell = super.getTableCellRendererComponent  
                        (table,value,isSelected,hasFocus,row,column);
            if(value.equals("g")) {                                                                      // Modifier la couleur
                cell.setBackground(Color.GREEN);
            }
            else 
            if (value.equals("r")) {  
                cell.setBackground(Color.RED);
            } 
            else {
                cell.setBackground(Color.white);
            }                                                                                                       // Renvoi de la cellule
            return cell;
        }
    }
    si ça peut aider...

  7. #7
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Merci mais...
    Fraco, je te remercie de t'interresser à mon problème.

    Mais j'avais déjà trouver ce code, sans arriver à le faire marcher (début de mon post).

    Il faut savoir que j'utilise des cellules combobox pour la plupart.

    J'ai repris ce code, car je le trouve partout donc ca doit être le code adapté...



    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 class cell_renderer extends DefaultTableCellRenderer { 
    	public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){ 
    		//Récupération du composant 
    		Component cell = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); 
    		System.out.println("Cell_Renderer");
    		//Modifier la couleur 
    		if(value.toString().compareTo("1") == 0){
    			cell.setBackground(Color.GREEN);
    			System.out.println("GREEN");
    		}
     
    		else if (value.toString().compareTo("-1") == 0)
    				cell.setBackground(Color.RED); 
     
    		//Renvoi du composant 
    		return cell; 
    	} 
     
    }
    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 void set_table_Salle(int nb_columns){
    		 model = getColumnModel();
     
    		 combo = new JComboBox();
    		 combo.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 16));
    		 combo.addItem("-1");
    		 combo.addItem("1");
    		 combo.addItem("2");
    		 combo.setBackground(new Color(225,30,125));
    		 combo.addItemListener(new java.awt.event.ItemListener() {
    				public void itemStateChanged(java.awt.event.ItemEvent e) {
    					combo_itemStateChanged(e);
    				}
    			});
     
    		 for(int i = 1;i<nb_columns;i++){
    			 table_column = model.getColumn(i);
    			 TableCellEditor tce = new DefaultCellEditor(combo);
    			 table_column.setCellEditor(tce);
     
    		 }
     
    	 }
     
    	 private void combo_itemStateChanged(java.awt.event.ItemEvent e){
    		 if(e.getStateChange() == ItemEvent.DESELECTED){
    			 cell_renderer cr = new cell_renderer();
    			 JComboBox c = (JComboBox)e.getSource();
    			 cr.getTableCellRendererComponent(this, c.getSelectedItem(), true, true, this.getSelectedRow(), this.getSelectedColumn());
    }
    Dans l'initialisation de la table, je fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table.set_table_Salle(nb_columns);
    table.setDefaultRenderer(JLabel.class, new cell_renderer());
    J'ai essayé avec JLabel.class,JComboBox.class,String.class,JTable.class....

    Mais pas de résultat.
    Merci de votre aide

  8. #8
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut +
    C'est normal que ca ne marche pas si je ne récupère pas le component :

    public Component getTableCellRendererComponent

    Ma question est comment le récupérer pour le faire pointer sur une de mes cellules....

    Je m'arrache les cheveux...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 71
    Par défaut
    Citation Envoyé par donnadieujulien Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	 
    	 private void combo_itemStateChanged(java.awt.event.ItemEvent e){
    		 if(e.getStateChange() == ItemEvent.DESELECTED){
    			 cell_renderer cr = new cell_renderer();
    			 JComboBox c = (JComboBox)e.getSource();
    			 cr.getTableCellRendererComponent(this, c.getSelectedItem(), true, true, this.getSelectedRow(), this.getSelectedColumn());
    }
    J'ai l'impression que tu t'emmêles les pinceaux là...
    Reprends depuis le début, et essayes déjà de changer les couleurs des celulles d'une jtable, sans editor particuliers...

    http://java.sun.com/docs/books/tutor...tml#editrender

    Ta jtable n'affichera que des String, des Integer, des Double, etc... Donc tu appliques pour chacun de ces types d'objet un rendu.
    Tu peux leur appliquer le même rendu pour tous, ça sera dans la méthode getTableCellRendererComponent que tu devras traiter les différents cas en fonction du numéro de la colonne, de la ligne, de la valeur, etc...

  10. #10
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut J'y arrives
    Pour changer toutes les cellules de la jtable, j'y arrives avec Default table cell Renderer.

    Mais ca ne répond pas à ma question :

    public Component getTableCellRendererComponent

    Il faut bien le récupérer ce component, pour qu'il point sur ma cellule non?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 71
    Par défaut
    Tu as une implémentation de TableCellRenderer => DefaultTableCellRenderer
    Dedans, tu redéfinis la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    getTableCellRendererComponent(JTable table,
                                            Object value,
                                            boolean isSelected,
                                            boolean hasFocus,
                                            int row,
                                            int column)
    qui comme l'indique la javadoc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Returns the component used for drawing the cell.

    Ensuite, à ton instance de JTable, tu lui dis que tous les Objets d'un certain type vont utiliser ton renderer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Toutes les Strings seront représenté par le Component retourné par la méthode getTableCellRendererComponent de la classe DefaultTableCellRenderer
    instanceJTable.setDefaultRenderer(String.class, new DefaultTableCellRenderer());

    Donc en fait, pour répondre à ta question , tu n'as jamais à faire appel à getTableCellRendererComponent c'est la JTable qui va le faire elle même.
    En plus, au moment où elle va l'appeler, elle va lui passer en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Object value, //La valeur à afficher dans la cellulle
    boolean isSelected, //Si la cellule est sélectionné
    boolean hasFocus, //Si la cellule a le focus
    int row, //La ligne de la cellule
    int column //La colonne de la cellule
    Si donc tu as regardé ici:
    http://java.sun.com/docs/books/tutor....html#renderer

    Tu as surement du voir dans l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class ColorRenderer extends JLabel
                               implements TableCellRenderer {
    
     [...]
     public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
            [...]
            return this;
        }

    C'est plus clair ?

  12. #12
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut J'en ai marre
    Ca marche toujours pas...
    J'ai fait ça :
    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
     
     
    public class ColorRenderer extends JLabel implements TableCellRenderer {
        public Component getTableCellRendererComponent(JTable table, Object color,
                boolean isSelected, boolean hasFocus,int row, int column) {
            System.out.println("ChangeColor");
            if(table.getValueAt(row, column).toString().compareTo("-1") == 0){
                this.setBackground(new Color(0,0,0));
            }
            else if(table.getValueAt(row, column).toString().compareTo("1") == 0){
                this.setBackground(new Color(0,0,255));
            }
            else if(table.getValueAt(row, column).toString().compareTo("2") == 0){
                this.setBackground(new Color(255,0,0));
            }
            return this;
        }
    }
    et ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table.setDefaultRenderer(String.class, new ColorRenderer());
    Mais la console n'affiche jamais "ChangeColor". Donc cette classe ne s'exécute jamais...

    Ca commence à me gonfler.

    Dans ma table, j'ai défini des cellules combobox et d'autres "normales" (texte seulement).

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    A quoi ressemble ton TableModel de ta JTable ?

  14. #14
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Ca y est
    Je mets mon code pour ceux que ca interresse :

    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
    package table;
     
    import java.awt.Color;
    import java.awt.Component;
     
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
     
    public class ColorRenderer extends DefaultTableCellRenderer {
     
    	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(column != 0){
    			if (table.getValueAt(row,column).toString().compareTo("-1") == 0){
    				cell.setBackground(Color.BLACK);
    				cell.setForeground(Color.WHITE);
    			}
     
    			else if(table.getValueAt(row,column).toString().compareTo("1") == 0){
    				cell.setBackground(Color.BLUE);
    				cell.setForeground(Color.GRAY);
    			}
     
    			else if(table.getValueAt(row,column).toString().compareTo("2") == 0){
    				cell.setBackground(Color.RED);
    				cell.setForeground(Color.CYAN);
    			}
    			else{
    				cell.setBackground(Color.DARK_GRAY);
    				cell.setForeground(Color.WHITE);
    			}
    		}
     
    		return cell;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void centrerTable(JTable table){
    	   for(int i = 0;i < table.getColumnCount();i++){
    		   ColorRenderer cr = new ColorRenderer();
    		   cr.setHorizontalAlignment(JLabel.CENTER);
    		   table.getColumnModel().getColumn(i).setCellRenderer(cr);
    	   }
    }
    Cette mérhode fait maintenant plus que centrer le texte dans les cellules.

    Encore une fois tout ca pour ca...

    Pas besoin de se faire chier à spécifier des String.class ou autre...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/08/2010, 08h20
  2. Changer la couleur de fond cellules ListView
    Par mpereg dans le forum Général VBA
    Réponses: 0
    Dernier message: 24/03/2008, 11h48
  3. Réponses: 4
    Dernier message: 17/03/2008, 11h03
  4. [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