Changer la couleur de certaines lignes mais pas de toutes dans une JTable
-
12-12-2019 - |
Question
J'ai créé une classe de rendu de cellules personnalisée pour y parvenir.
public class MatchTableCellRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent (JTable table,
Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
Component cell;
cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column);
if( ((String[]) ((MatchTableModel) table.getModel()).getRow(row)).length==7 ){
System.out.println(((String[]) ((MatchTableModel) table.getModel()).getRow(row))[0]+" "+((String[]) ((MatchTableModel) table.getModel()).getRow(row))[6]);
cell.setForeground(Color.green);
}
return cell;
}
}
Et j'ai configuré ce moteur de rendu pour qu'il soit utilisé par les colonnes de ma table :
tempColumn = table.getColumnModel().getColumn(0);
tempColumn.setCellEditor(new MacColumnEditor());
tempColumn.setCellRenderer(new MatchTableCellRenderer());
tempColumn = table.getColumnModel().getColumn(1);
tempColumn.setCellEditor(new IpColumnEditor());
tempColumn.setCellRenderer(new MatchTableCellRenderer());
tempColumn = table.getColumnModel().getColumn(2);
DefaultCellEditor dfEditor=new DefaultCellEditor(new JTextField());
dfEditor.setClickCountToStart(2);
tempColumn.setCellEditor(dfEditor);
tempColumn.setCellRenderer(new MatchTableCellRenderer());
Je veux les lignes qui contiennent un String[] de longueur = 7 vert et les autres avec la couleur par défaut.Mais il est intéressant que toutes mes lignes deviennent vertes.J'ai une ligne d'impression comme vous pouvez le voir.Il est imprimé 4 fois (mon tableau comporte 12 lignes), mais toutes les lignes sont rendues vertes, au lieu de 4.Qu'est-ce que je fais mal?
La solution
La raison est la mémoire de couleur infâme (TM) de la valeur par défautTableCelleditor: vous devez définir les couleurs toujours , au lieu de une seule branche.
if (myCondition) {
setBackground(...) {
} else {
setBackground(...)
}
Les détails exacts sont expliqués dans un Thread récent
Autres conseils
Vous pouvez utiliser XxxCellRenderer
, mais le mieux et le plus simple est d'utiliser prepareRenderer()
pour un code correct, vous devez remplacer ou tester à l'intérieur de if-else suit les paramètres
est sélectionné
aFocus
colonne
rangée
plus dans réponses et question à propos d'un problème similaire