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] Colorier une cellule


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut [jTable] Colorier une cellule
    Bonjour à tous,

    Je souhaite colorier une cellule selon une valeur int que j'ai.

    Je veux 3 couleurs (bleu, noir et rouge).
    Si mon int est <20, alors je colorie la cellule en bleu
    si compris entre 20 et 50, je colorie en noir,

    sinon, je colorie en rouge.

    Je ne sais pas comment faire ca.
    J'ai lu qu'il y avait les rendered, mais je ne les comprends pas trop
    MERCI

  2. #2
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    personne ne voit?

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    Points : 467
    Points
    467
    Par défaut
    Je pense que tu es obligé d'utiliser des renderers, mais rassure-toi c'est pas si difficile .
    Vas voir le tutorial de Sun, si tu comprend pas revient...
    http://java.sun.com/docs/books/tutor...tml#editrender

  4. #4
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Merci pour le lien,

    je viens de lire, mais sincèrement, je ne comprends pas tout (j'ai un peu de mal)!!

    D'apres ce que je comprends, je crée un renderer.

    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
    public class ColorRenderer extends JLabel
                               implements TableCellRenderer {
        ...
        public ColorRenderer(boolean isBordered) {
            this.isBordered = isBordered;
            setOpaque(true); //MUST do this for background to show up.
        }
     
        public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
            Color newColor = (Color)color;
            setBackground(newColor);
            if (isBordered) {
                if (isSelected) {
                    ...
                    //selectedBorder is a solid border in the color
                    //table.getSelectionBackground().
                    setBorder(selectedBorder);
                } else {
                    ...
                    //unselectedBorder is a solid border in the color
                    //table.getBackground().
                    setBorder(unselectedBorder);
                }
            }
     
            setToolTipText(...); //Discussed in the following section
            return this;
        }
    }
    Mais après ,comment on l'utilise?
    Cad comment je fais pour que ce soit compatile avec mon cas?

    Pour tout vous dire, j suis un peu dépassé par la théorie! Je n'arriva pas à voir comment ca fonctionne cette histoire!
    On surcharge une methode? On redéfinit une methode??

    D'avance merci pour votre aide

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 159
    Points : 467
    Points
    467
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
    }
    En fonction des valeurs qu'on te donne en parametre, tu cree un composant et te le renvoi dans ton return. Si la classe hérite d'un composant comme dans ton cas un JLabel, tu peux retourner this après avoir fait quelques modifications.

  6. #6
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
    }
    C'est simple : cette fonction va te permettre de renvoyer le composant de ton choix pour la case definie par les variables row et column. En gros, tu peux faire un test pour voir si tu te situes à la case 2:1 par exemple et décider de renvoyer un composant de type JLabel (toujours par exemple) et y définir les propriétes que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
     
        JLabel la_case = new JLabel();
     
        if (column == 2 && row == 1) la_case.setBackground(Color.red);
        else la_case.setBackground(Color.white);
     
        return la_case;
    }
    Tu peux également tester si cette case est sélectionnée (paramètre isSelected) et mettre des couleurs en conséquence.

  7. #7
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Merci à vous deux pour la reponse...

    Je dois etre idiot, mais je ne comprends toujours pas, pourtant ca a l'air simple, mais je pige pas le fonctionnement exacte du bazar

    L'exemle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Component getTableCellRendererComponent(  JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {   JLabel la_case = new JLabel();   if (column == 2 && row == 1) la_case.setBackground(Color.red); else la_case.setBackground(Color.white);   return la_case; }
    Ca permet de voir si on est dans la colonne 2 et ligne 1, si c'ets le cas, on met le jlabel en couleur rouge (j'espere que j'ai bon jusque là)

    Mais le jlabel, il est dans le tableau?
    Parce qu'on le crée, mais il est attaché à rien?!!

    Imaginons (pour faire simple) que j'ai un tableau 2x2. Je veux, par rapport aux données de la colonne 1, mettre la colonne 2 en couleur.

    JE ne veux en aucun cas une solution faite, mais plutot quelque chose pour moi comprendre le fonctionnement (je pense que je vois pas la philosophie de la chose)

    D'avance un tout grand merci (et désolé d'insister et de pas comprendre... )

  8. #8
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par Terminator
    Ca permet de voir si on est dans la colonne 2 et ligne 1, si c'ets le cas, on met le jlabel en couleur rouge (j'espere que j'ai bon jusque là)
    Jusque là ça va
    Citation Envoyé par Terminator
    Mais le jlabel, il est dans le tableau?
    Parce qu'on le crée, mais il est attaché à rien?!!
    Tout ce qu'il faut comprendre, c'est que chaque case de la JTable est un composant propre, individuel et indépendant des autres cases de la JTable. Le ListCellRenderer de base de la JTable (celui créé par défaut par le composant) implémente la fonction public Component getTableCellRendererComponent(), seulement le composant qu'elle renvoit est vide.

    En redéfinissant le ListCellRenderer de la JTable, tu redéfinis également quels sont les composants à afficher dans chaque case de la JTable !

    Est-ce plus clair ?

  9. #9
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    ok, c'est bcp plus clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    JLabel la_case = new JLabel();
     
        if (column == 2 && row == 1) la_case.setBackground(Color.red);
        else la_case.setBackground(Color.white);
     
        return la_case;
    Mais dans cet exemple, le jLabel ca s'afficher où? dans la colonne 2 ligne 1? Car on retour je Jlabel, mais on l'arrache à rien, c'est cela qui me semble bizar!!!
    Merci encore pour les eclaircissements.

  10. #10
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par Terminator
    Mais dans cet exemple, le jLabel ca s'afficher où? dans la colonne 2 ligne 1? Car on retour je Jlabel, mais on l'arrache à rien, c'est cela qui me semble bizar!!!
    Merci encore pour les eclaircissements.
    Oui oui colonne 2 ligne 1. Quand tu dis on l'arrache je suppose que tu veux dire on l'attache
    Imagines que tu aies développé le composant JTable. Au moment de faire la programmation du remplissage des cases, tu t'es dit que tu allais créer une méthode spécifique, getTableCellRendererComponent, pour savoir quels devaient être les composants à renvoyer pour chaque case.
    Maintenant dis toi qu'il serait bien de permettre à l'utilisateur du composant JTable de pouvoir modifier le composant renvoyé à chaque case, d'oú l'implémnetation de la méthode setListCellRenderer !

    Le composant JTable, à la recherche de ce qu'il va remplir, va à chaque fois appeler cette méthode !

  11. #11
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    bonjour à tous,

    je viens d'essayer de faire ce que je voulais, à savoir colorier ma cellule en couleur selon de valeurs.

    Mais cela ne fonctionne pas et je sais pourquoi: mon code n'est jamais lu par la ma table.

    Ma question est donc la suivante:

    Est-ce que la fonction spécifique (à savoir getTableCellRendererComponent) est lue automatiquement par la Table ou dois-je l'appeler lors du trairtement de ma table?

    D'avance merci

  12. #12
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    As tu affecté ton renderer au JTable ?
    Perso je fais comme ca ... y'a probablement mieux à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Dans une classe qui dérive de JTable ....
      public void init(TableCellRenderer a_oColRenderer, TableCellRenderer a_oCellRenderer)
      {
        TableColumnModel o_oTableColModel = getColumnModel();
        int o_iNbCols = o_oTableColModel.getColumnCount();
     
        for (int c=0;c<o_iNbCols; c++)
        {
           TableColumn o_oTableCol = o_oTableColModel.getColumn (c);
           o_oTableCol.setHeaderRenderer (a_oColRenderer);
           o_oTableCol.setCellRenderer(a_oCellRenderer);
         }
      }
    A++

  13. #13
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    La réponse est ici : How to Use Tables (java.sun.com)

  14. #14
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Je me sens un peu perdu là

    Si je reviens sur l'exemple cité ci dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Component getTableCellRendererComponent(
      JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {  
     JLabel la_case = new JLabel();  
     if (column == 2 && row == 1) la_case.setBackground(Color.red); 
    else la_case.setBackground(Color.white); 
      return la_case; }
    imaginons que je creer un jtable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JTable maTable = new JTable();
    Pouvez-vous me fournir la ligne permettant de relier la table avec le renderer?

    D'avance merci

  15. #15
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 19
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Terminator
    Je me sens un peu perdu là

    Pouvez-vous me fournir la ligne permettant de relier la table avec le renderer?

    D'avance merci
    Dans le lien que j'ai mis juste au dessus Chapitre "editrender"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void setDefaultRenderer(Class<?> columnClass,
                                   TableCellRenderer renderer)
    Parameters:
    columnClass - set the default cell renderer for this columnClass
    renderer - default cell renderer to be used for this columnClass
    Javadoc JTable setDefaultRenderer

  16. #16
    pom
    pom est déconnecté
    Membre habitué
    Inscrit en
    Février 2003
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 120
    Points : 128
    Points
    128
    Par défaut
    setDefaultRenderer(Object.class, tonRenderer);

    A +

    Oula, t'es un rapide, psicot!

  17. #17
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Points : 99
    Points
    99
    Par défaut
    Merci à vous deux pour les reponses

    Mais je vais grandement vous decevoir: je comprends de moins en moins

    Vous allez un peu trop vite pour moi à ce niveau là!!

    Du coup, je repars à zero pour mieux tout comprendre:

    J'ai une class (et une seule) dans laquelle je crée une jtable avec des valeurs.
    Imaginons que la colonne 2 contient que des int.
    Lorsque mon int <10, je colorie en bleu, sinon je colorie en rouge.

    J'ai donc:

    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
    public class Analyse extends JFrame
    {
    	private JTable jTable = null;
           public Analyse {
     
    		 super();
     
    	      initialize();
     //... je passe sinon ca devient illisible avec tout ce que j'ai mis
     
    private JPanel getJContentPane(){
    		if (jContentPane == null) {
    			jContentPane = new JPanel();
    			jContentPane.setLayout(null);
    			jContentPane.setBackground(new Color(0, 204, 255));
    			jContentPane.add(getJScrollPane(), null);
    }
    		return jContentPane;
    	}
     
    	private JScrollPane getJScrollPane() {
    		if (jScrollPane == null) {
    			jScrollPane = new JScrollPane();
    			jScrollPane.setBounds(new Rectangle(39, 42, 747, 247));
    			jScrollPane.setViewportView(getJTable());
    		}
    		return jScrollPane;
    	}
     
    // Le model de table
    public void setModel(TableModel model) {
    		jTable.setModel(model);
    		}
     
     
    private JTable getJTable() {
    		if (jTable == null) 
                   {
                        jTable = new JTable();
    DefaultTableModel defaultModel = new DefaultTableModel(columsNames,0)
    			{
     
    			    public Class getColumnClass(int columnIndex)
    			    {
     
    			    	jTable.getColumnModel().getColumn(0).setPreferredWidth(300);
    			          if(columnIndex == 1 || columnIndex == 2 || columnIndex == 3 || columnIndex == 4) {
     
    			        	  return Integer.class;			               
    			          } else {
    			               return super.getColumnClass(columnIndex);
    			          }
    			     }
     
    			    public boolean isCellEditable(int rowIndex, int columnIndex) {			   
    			        // rendre non editable la jtable          
    			    	return columnIndex >= 10;			   
    			              }
    			};
    			setModel(defaultModel);		
     
    		return jTable;
    	}
     
     
     
    // J'ajoute à la fin du fichier ceci:
     public Component getTableCellRendererComponent(
                  JTable table, Object color,
                  boolean isSelected, boolean hasFocus,
                  int row, int col) {
     
    					Color newColor = (Color)color;
    					setBackground(newColor);
    					JLabel cellule = new JLabel();
    					if (col == 2)
    					{						
    						cellule.setOpaque(true);
    						cellule.setBackground(Color.blue);
    					}
    					return cellule;
    	  }
     
    }

    Dois-je ABSOLUMENT utiliser une autre class pour getTableCellRendererComponent ou puis-je le faire comme ci-dessus?

    Comment l'utiliser concretement? car le :
    setDefaultRenderer(Object.class, tonRenderer);

    Je ne vois pas exactement ce que cela veut dire?

    D'avance merci à tous

Discussions similaires

  1. [JTable] colorier une cellule désignée
    Par sam_saa dans le forum Composants
    Réponses: 2
    Dernier message: 26/05/2007, 16h42
  2. [JTable] Colorier une cellule d'une JTable
    Par Houssem dans le forum Composants
    Réponses: 1
    Dernier message: 15/05/2007, 14h54
  3. [JTable] Sélectionner une cellule
    Par GENERYS dans le forum Composants
    Réponses: 2
    Dernier message: 12/10/2005, 15h57
  4. [CR8.5][VS2002]Colorier une cellule
    Par San Soussy dans le forum SDK
    Réponses: 2
    Dernier message: 13/09/2005, 12h39

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