Bonjour à tous !
J'ai un souci avec mon cell renderer.
J'ai deux JTable disposées côte à côte, tous les items de la JTable de gauche sont contiennent une collection et c'est cette collection qui s'affiche dans la JTable de droite lorsqu'un item de la JTable de gauche est sélectionné.
J'ai besoin de colorer le texte de certaines colonnes de la JTable de droite en vert ou rouge si la colonne contient une donnée (le choix entre rouge ou vert se fait en fonction du contenu), si elle ne contient pas de donnée je laisse la case vide.
Le problème est qu'en réalité les cellules sont (et seront) de la même couleur que celle utilisée pour l'affichage de la première cellule dessinée par mon renderer.
Exemple :
L'item 1 contient un élément qui n'affiche rien dans les colonnes "colorées"
L'item 2 contient un élément qui affiche une valeur rouge dans la première colonne et une valeur verte dans la seconde colonne.
Au chargement de ma JFrame aucune donnée n'est affichée dans ma jtable de droite.
Maintenant lorsque j'arrive sur cette JFrame et que je clique sur l'item 2 le texte des deux colonnes colorées est rouge (alors que seul le texte de la première devrait l'être, le texte de la seconde devant être coloré en vert).
Plus "drôle" encore : si maintenant je sélectionne la ligne, le texte de la seconde colonne s'affiche bien en vert. Si je dé-sélectionne la ligne, le texte redevient rouge.
Si je refais la manip en sélectionnant d'abord l'item 1 (qui n'affiche pas de données dans les colonnes "colorées") et qu'ensuite je sélectionne l'item 2 les deux colonnes ne sont ni rouges ni vertes, mais noires (couleur de texte classique, donc).
Si je sélectionne la ligne je vois les bonnes couleurs derrière la sélection.
J'imagine bien que c'est un problème lié au JLabel du renderer qui est dupliqué partout mais après plusieurs tentatives infructueuses j'en viens à vous demander de l'aide.
Voici le code de mon Renderer :
DatePassage étant un petit objet composé d'une date et d'un booléen.
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 public class DatePassageRenderer extends DefaultTableCellRenderer{ DateFormat formatter; public DatePassageRenderer() { super(); } public void setValue(Object value) { super.setValue(value); setForeground(UIManager.getColor("Table.foreground")); if(formatter == null) { formatter = new SimpleDateFormat("EEEE d/MM/yyyy"); } if(value != null) { DatePassage dp = (DatePassage) value; if(dp.getDate() != null) { setText(formatter.format(dp.getDate())); if(dp.getLate() != null) { if(dp.getLate()) { setForeground(Color.RED); } else { setForeground(Color.GREEN); } } } else { setText(""); setForeground(UIManager.getColor("Table.foreground")); } } } }
Le booléen indique s'il y a un retard ou non (si retard le texte passe en rouge sinon il est affiché en vert).
Je vous remercie d'avance pour votre aide et reste à votre disposition pour toute éventuelle question.
Partager