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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top