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 :

Coloration de certaines lignes jTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par défaut Coloration de certaines lignes jTable
    Bonjour,

    Apres avoir lu plusieurs explications sur le sujet, je ne suis pas parvenu a mettre en place une solution efficace pour répondre à mon besoin.

    Je créé un tableau avec jTable par l'interface graphique du netbeans. Je le remplis grace à un vecteur qui lit les informations depuis une base de données.

    Parmis les informations, il y a une variable "Etat" pouvant prendre les valeurs "Oui" ou "Non".

    Ce que je souhaite faire est simple dans l'idée, c'est requeter la base de données (dison un select * from ma_table) et inséréer les valeurs dans le jTable.

    Dès que la colonne "Etat" du tuple courant est à "Oui", je souhaite colorer le background de la ligne en Vert, si c'est à "Non", le colorer en rouge.

    J'ai pu lire qu'il fallait modifier le CellRenderer, mais sans grand succès quant à se mise en application dans mon soft. Pourriez vous m'aider à construire ce bout de code ?

    Merci par avance.

    Ci joint, les quelques lignes de remplissage de ma jTable:
    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
     
        public void rempliTableau() 
        {
            clearTable();
            Vector row = null;
            Vector table = new Vector();
            String sRequete = "";
            GestionBD base=null;           // Connexion à la base de données
            ResultSet res;                 // "res" permet de récupérer le résultat des requetes
     
            sRequete = "SELECT * FROM ma_table";
            try{
                base=new GestionBD("","");
                base.requeteSelect(sRequete);
                res = base.getRS();
     
                while(res.next())
                {
                    row = new Vector();
                    row.add(res.getString("champs_1"));
                    row.add(res.getString("champs_2"));
                    row.add(res.getString("champs_3"));
     
                    if( res.getString("Etat").compareTo("Oui") == 0 )
                    {
                         BACKGROUND DE LA LIGNE COURANTE EN VERT
                    }
                    else
                    {
                         BACKGROUND DE LA LIGNE COURANTE EN ROUGE
                    }
     
                    table.add(row);
                }
                base.close();
            }
     
            // Récupération des éventuelles erreurs
            catch (Exception e){ /*...*/ }
            finally { /* ... */ }
     
            // Remplissage d'une table temporaire avec les données
            _model.setDataVector(table,columnNames);
            // Application à la jTable
            jTable1.setModel(_model);
        }

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut Comment customizer un tableau
    Primo faut savoir que les tableaux sont des composants compliqués et qui offre peu pour la customisation.
    La première chose à faire pour s'en sortir et de redessiner le diagramme de classe des JTable, avec les responsabilités (c'est ticky).

    Ensuite à ton JTable tu construis à la main un TableModel qui utilise ton ResultSet.

    Il te reste à créer un CellRenderer, mais ce dernier fonctionne que Cellule par cellule, il faut donc que tu interroges ton model pour connaitre la couleur de ta cellule sur ta ligne.

    Bon courage.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par défaut
    Merci de ta réponse, qui malheureusement n'apporte pas vraiment d'eau a mon moulin. J'ai déja lu ce genre de chose (concernant le cellRenderer). Cependant je n'ai pas réussi a trouvé d'exemple simple que je pourrais reprendre afin de l'adapter a mon code.

    Ce que je souhaiterais, c'est soit un exemple concret qui ressemble a ce que je veux faire, soit quelques lignes de codes complétant celui que j'ai posté plus haut.

    Il est clair que ca n'a pas l'air facil (merci pour le bon courage ), mais ca me parait un peu bizard que cela soit si compliqué de colorier des cellules!!

  4. #4
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 93
    Par défaut
    Il me semble que la JXTable de l'API SwingX permet de simplifier grandement ce genre de choses.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par défaut
    Ok je vais me renseigner sur le sujet. Mais la lib SwingX n'est pas livrée de base avec netbeans. Il doit falloir l'inclure je suppose.

    Si quelqu'un a une solution avec les outils de base, je suis preneur !!
    Merci.

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Primo faut savoir que les tableaux sont des composants compliqués et qui offre peu pour la customisation.
    Disons plutôt qu'il faut un petit moment pour comprendre leur principe de fonctionnement.

    Pour afficher les lignes en vert ou en rouge, tu peux utiliser le Renderer suivant :
    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
    public static class MonRenderer2 extends DefaultTableCellRenderer {
     
        public final static int BOOLEAN_COLUMN_INDEX = 3;
     
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component comp = super.getTableCellRendererComponent(table,                            value, isSelected, hasFocus, row, column);
     
            if (Boolean.TRUE.equals(table.getValueAt(row, BOOLEAN_COLUMN_INDEX)))
                comp.setBackground(Color.GREEN);
            else
                comp.setBackground(Color.RED);
     
            return comp;
        }
    }
    Et dans ton code, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                while(res.next())
                {
                    row = new Vector();
                    row.add(res.getString("champs_1"));
                    row.add(res.getString("champs_2"));
                    row.add(res.getString("champs_3"));
                    if(res.getString("Etat").equals("Oui"))
                      row.add(Boolean.TRUE);
                    else
                      row.add(Boolean.FALSE);
    L'embêtant avec ce code, c'est qu'il va t'afficher la colonne de Booleens, en plus de mettre le background en vert ou rouge. Pour cacher cette colonne, tu peux redéfinir un TableModel (facile si on n'ajoute pas de lignes ni de colonnes), ou utiliser une JXTable.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 93
    Par défaut
    Sur le site de SwingX, il y a un tuto expliquant comment intégrer leurs composants à NetBeans

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Par défaut
    J'ai installé la librairie jXtable. Effectivement, le tutorial de swingX est bien fait. Cependant, je n'ai pas encore trouvé de méthode qui simplifie la coloration des lignes... Avez vous des exemples ?
    Merci.

  9. #9
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Bonjour,
    Voici comment je fais :

    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
     
    public class FormatTable extends JTable{
     
    	private FormatTableModel ftm;
     
    	private FormatCellRenderer white = new FormatCellRenderer(Color.WHITE);
    	private FormatCellRenderer green = new FormatCellRenderer(Color.GREEN);
    	private FormatCellRenderer red = new FormatCellRenderer(Color.RED);
     
    	public FormatTable(FormatTableModel ftm){
    		super(ftm);
    		this.ftm = ftm;
    	}
     
    	public TableCellRenderer getCellRenderer(int row, int col){
    		FormatTableModel.ACTION_STATE state = this.ftm.getState(row);
    		TableCellRenderer tc = white;
    		if(state == FormatTableModel.ACTION_STATE.NOT_DONE){
    				tc = white;
    		}
    		else if(state == FormatTableModel.ACTION_STATE.DONE_OK){
    				tc = green;
    		}
    		else if(state == FormatTableModel.ACTION_STATE.DONE_ERROR){
    				tc = red;
    		}
     
    		return tc;
    	}
     
     
    	private class FormatCellRenderer extends DefaultTableCellRenderer{
     
    		private Color c;
     
    		public FormatCellRenderer(Color c){
    			this.c = c;
    		}
     
    		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
    			Component cp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    			cp.setBackground(c);
    			return cp;
    		}
     
    	}
    }

Discussions similaires

  1. Colorer certaines lignes d'une DDL
    Par erfindel dans le forum ASP.NET
    Réponses: 6
    Dernier message: 14/12/2009, 16h29
  2. Colorer ligne jtable
    Par mmb04 dans le forum Composants
    Réponses: 7
    Dernier message: 17/04/2007, 15h52
  3. [jTable] Dimensionner la hauteur de certaines lignes
    Par delma dans le forum Composants
    Réponses: 11
    Dernier message: 27/10/2006, 09h29
  4. [JTable] affichage optionnel de certaines lignes
    Par Nicool dans le forum Composants
    Réponses: 10
    Dernier message: 08/06/2006, 15h59

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