Coloration de certaines lignes jTable

Coloration de certaines lignes jTable - Java - Programmation

Marsh Posté le 03-11-2006 à 12:05:32    

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.
 
Voici les quelques lignes de remplissage de ma jTable:

Code :
  1. public void rempliTableau()
  2. {
  3.       clearTable();
  4.       Vector row = null;
  5.       Vector table = new Vector();
  6.       String sRequete = "";
  7.       GestionBD base=null; // Connexion à la base de données  
  8.       ResultSet res; // "res" permet de récupérer le résultat des requetes  
  9.       sRequete = "SELECT * FROM ma_table";
  10.       try
  11.       {
  12.            base=new GestionBD("","" );
  13.            base.requeteSelect(sRequete);
  14.            res = base.getRS();
  15.            while(res.next())
  16.            {
  17.                 row = new Vector(); 
  18.                 row.add(res.getString("champs_1" ));
  19.                 row.add(res.getString("champs_2" ));
  20.                 row.add(res.getString("champs_3" )); 
  21.                 if( res.getString("Etat" ).compareTo("Oui" ) == 0 )
  22.                 {
  23.                      BACKGROUND DE LA LIGNE COURANTE EN VERT
  24.                 }
  25.                 else
  26.                 {
  27.                      BACKGROUND DE LA LIGNE COURANTE EN ROUGE 
  28.                 } 
  29.                 table.add(row);
  30.            }
  31.            base.close();
  32.       }
  33.       catch (Exception e){ /*...*/ }
  34.       finally { /* ... */
  35.       // Remplissage d'une table temporaire avec les données  
  36.       _model.setDataVector(table,columnNames);
  37.    
  38.      // Application à la jTable  
  39.      jTable1.setModel(_model);
  40. }


Message édité par lhpp le 03-11-2006 à 12:06:04
Reply

Marsh Posté le 03-11-2006 à 12:05:32   

Reply

Marsh Posté le 03-11-2006 à 19:44:31    

Demande à Google : JTable + Color
Q : How can I set the color (or font) on a specific cell (row, column) in a JTable?
A :  In order to set the color or font for a specific table cell you must create a custom TableCellRenderer. The easiest way to create one is to extend the DefaultTableCellRenderer.  
 
Par exmple :
http://www.javaworld.com/javaworld [...] table.html
http://brassens.upmf-grenoble.fr/I [...] gTable.htm

Reply

Marsh Posté le 08-01-2007 à 22:44:32    

Salut,
 
j'ai pas mal galérer pour trouver ça , et malheureusement , je n'ai plus les références de celui qui l'a créé; mais ça marche :)
 
Il faut créer une classe renderer telle que celle ci :
 

Citation :

public class TraitementRenderer
    extends DefaultTableCellRenderer {
 
  protected TableCellRenderer renderer;
  protected ColorProvider provider;
  JLabel label = new JLabel();
 
  public TraitementRenderer(TableCellRenderer aRenderer,
                           ColorProvider provider) {
    this.renderer = aRenderer;
    this.provider = provider;
  }
 
  public Component getTableCellRendererComponent(JTable table, Object value,
                                                 boolean isSelected,
                                                 boolean hasFocus, int row,
                                                 int column) {
    Color bgrd = null;
    Color fgrd = null;
    if (isSelected) {
      fgrd = table.getSelectionForeground();
      bgrd = table.getSelectionBackground();
    }
    else {
      // Adjust for columns moving around
      int mcol = table.convertColumnIndexToModel(column);
      // Get the colors from the provider
      fgrd = provider.getForeground(row, mcol);
      bgrd = provider.getBackground(row, mcol);
    }
    Component c =
        renderer.getTableCellRendererComponent(
        table,
        value,
        isSelected,
        hasFocus,
        row,
        column);
    // Set the component colours
    c.setBackground(bgrd);
    c.setForeground(fgrd);
   
}


 
Puis mettre dans la classe qui traite la JTable le code ci dessous :
 

Citation :

private void registerRendererForClass(JTable table, Class classe) {
    // Get Default Renderer from the table
    DefaultTableCellRenderer defaultRenderer =
        (DefaultTableCellRenderer)
        table.getDefaultRenderer(classe);
    // Wrap(Decorate) the color renderer around the default renderer
    TableCellRenderer colorRenderer = new
        TraitementRenderer(defaultRenderer, provider);
    // Register the color Renderer with the JTable
    table.setDefaultRenderer(classe, colorRenderer);
  }
 
  /**Inner classe implémentant l'interface colorprovider
   * pour colorer les cellules, les lignes ou les colonnes
   * */
 
  ColorProvider provider = new ColorProvider() {
    public Color getForeground(int row, int column) {
      // colorie l'écriture des colonnes choisies
      if (column == 2) {
        return Color.BLUE;
      }
      if (column == 14) {
        return Color.MAGENTA;
      }
      else {
        return Color.black;
      }
    }
 
    public Color getBackground(int row, int column) {
      if (model.isEnded(row)) {
        return Color.LIGHT_GRAY;
      }
      if (model.isNewLine(row)) {
        return Color.cyan;
      }
      else {
        return Color.white;
      }
    }
  };


 
toujours dans la même classe :
 
     

Citation :

tableau = new JTable(model);
      registerRendererForClass(tableau, String.class);
      registerRendererForClass(tableau, Integer.class);
      registerRendererForClass(tableau, Date.class);
      // pour la boolean.class, on n'utilise pas un defautTableCellRend.. mais un TableCellRend..
      TableCellRenderer BRenderer = tableau.getDefaultRenderer(Boolean.class);
      TableCellRenderer colorRenderer = new TraitementRenderer(BRenderer, provider);
      tableau.setDefaultRenderer(Boolean.class, colorRenderer);


 
et enfin dans la classe qui étend l'AbstractTableModel on définit les lignes devant être coloriées
 

Citation :

public boolean isEnded(int row) {
    Date d = (Date)this.getValueAt(row, 10);  //colorie en gis les lignes dont la date de la colonne 10 est antérieure à la date du jour
    if ( (d != null) && (d.before(new Date()))) {
      return true;
    }
    else {
      return false;
    }
  }
 
  public boolean isNewLine(int row) { // colorie en bleu les lignes ajoutée à la table
    if ( (row == this.getRowCount() - 1) && (Traitement.newLine == true)) {
      return true;
    }
    else {
      return false;
    }
  }


 
Voila , je pense n'avoir rien oublié, une fois qu'on a comprit le code , on peut le réutiliser et le manipuler sans problème; ceci dit je l'aurai pas trouver tout seul ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed