[DefaultTableCellRenderer] couleurs ds 1 JTable

couleurs ds 1 JTable [DefaultTableCellRenderer] - Java - Programmation

Marsh Posté le 21-02-2005 à 14:46:04    

bonjour,  
J'ai posté ce message sur un autre forum mais vu que je n'ai pas de réponse je me permet de vous poser la question également.
Voilà, dans mon programme je veux colorier les cases d'une JTable uniquement si elles sont du type couleur et en fonction de la valeur qu'elles contiennent. Par exemple une case de type couleur aura pour valeur 12632256. On connait le type d'élément grâce à une chaîne de caractères passée en paramètre au début du programme.  
 
Je vérifie d'abord que l'élément est de type couleur et si il l'est je l'ajoute dans un hashtable :  
 

Code :
  1. nb_lignes = table.getRowCount();
  2.     int nb_col = table.getColumnCount();
  3.    Hashtable couleurs = new Hashtable();
  4.    for (int indice_ligne = 0 ; indice_ligne < nb_lignes ; indice_ligne++){
  5.      for (int indice_colonne = 0; indice_colonne < nb_col; indice_colonne++) {
  6.        String morceau = nom_colonnes.split(";" )[indice_colonne];
  7.        if (morceau.split("," )[2].equals("couleur" )) {
  8.        Color couleur = convertirCouleur((String) table.getValueAt(indice_ligne, indice_colonne));
  9.        couleurs.put((String) table.getValueAt(indice_ligne, indice_colonne),couleur);
  10.        }
  11.      }
  12.    }


 
 
Voici ma méthode de conversion :  
 

Code :
  1. public Color convertirCouleur(String c) {
  2.     int coul = Integer.parseInt(c);
  3.     int b = coul / 65536;
  4.     int v = (coul % 65536) / 256;
  5.     int r = ( (coul % 65536) % 256);
  6.     return new Color(r, v, b);
  7.   }


 
Contenu de ma classe héritant de DefaultTableCellRenderer :  
 

Code :
  1. package boutons;
  2. import java.util.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import javax.swing.table.*;
  6. import javax.swing.table.DefaultTableCellRenderer;
  7. import java.util.Hashtable;
  8. public class CustomTableCellRenderer extends DefaultTableCellRenderer{
  9.   private Hashtable couleur;
  10.    public CustomTableCellRenderer(Hashtable c) {
  11.    couleur = c ;
  12. }
  13.   public  Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  14.   Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
  15.   CouleurRVB coul;
  16.   coul = new CouleurRVB((String)value,couleur);
  17.   cell.setBackground(coul.getCouleur());
  18. return cell;
  19. }
  20. }


 
 
Et pour finir voici ma méthode CouleurRVB qui en fonction du contenu de la cellule va renvoyer la couleur :  
 

Code :
  1. package boutons;
  2. import java.util.*;
  3. import java.awt.*;
  4. //Couleur des composants du planning  
  5. public class CouleurRVB
  6. {
  7.   private Hashtable couleurs; //hashtable de color ayant pour clé les cellules  
  8.   private String cell; //cellule  
  9.   public CouleurRVB(String cellule, Hashtable c)
  10.   {
  11.     cell = cellule;
  12.     couleurs = c;
  13.   }
  14.   //renvoie la couleur en fonction du type  
  15.   public Color getCouleur()
  16.   {    return (Color) couleurs.get(cell);
  17.   }
  18. }


 
Dans mon JTable les couleurs s'affichent en revenche j'ai perdu le focus. De plus lorsque je clic sur n'importe quelle case même une case blanche j'ai le message d'erreur suivant que je ne comprends pas :  
 
java.lang.NullPointerException at java.util.Hashtable.get(Hashtable.java:333)  
 
 
 
qui me renvoie à cette partie de la classe hashtable  

Code :
  1. public synchronized Object put(Object key, Object value) {
  2.    // Make sure the value is not null  
  3.    if (value == null) {
  4.        throw new NullPointerException();
  5.    }
  6.    // Makes sure the key is not already in the hashtable.  
  7.    Entry tab[] = table;
  8.    int hash = key.hashCode();
  9.    int index = (hash & 0x7FFFFFFF) % tab.length;
  10.    for (Entry e = tab[index] ; e != null ; e = e.next) {
  11.        if ((e.hash == hash) && e.key.equals(key)) {
  12.       Object old = e.value;
  13.       e.value = value;
  14.       return old;
  15.        }
  16.    }


 
C'est une histoire de pointeurs mais ça ne m'en dit pas +.  
 
Désolé si c'était un peu long mais quelqu'un comprends-il ou se situe mon erreur ? Sachant qu'aucune action autre qu'un simple affichage n'est censée se faire lorsque l'on clic sur la JTable.  
 
Merci de votre aide

Reply

Marsh Posté le 21-02-2005 à 14:46:04   

Reply

Marsh Posté le 21-02-2005 à 16:57:43    

Je pense que tu te complique la vie avec ta Hashtable et tout le reste. Dans ton ColorRenderer, appelle simplement une méthode statique pour parser la String et positionner la couleur :
 

Code :
  1. setBackground(parseColor((String) value));
  2. ...
  3. private static Color parseColor (String sColor){
  4. ...
  5. }


 
A priori tu connais la colonne qui affiche des couleurs. Il ne reste plus qu'à utiliser ce renderer sur les bonnes colonnes.


---------------
Gestion de bug en mode ASP/java : http://eap.bug-sweeper.fr
Reply

Sujets relatifs:

Leave a Replay

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