Pergunta

Eu criei uma classe de renderizador de célula personalizada para conseguir isso.

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;
    }


}

E configurei este renderizador para ser usado pelas colunas da minha tabela:

    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());

Quero as linhas que contêm uma String[] de comprimento = 7 verde e as demais com a cor padrão.Mas é interessante que todas as minhas linhas fiquem verdes.Eu tenho uma linha de impressão como você pode ver.É impresso 4 vezes (minha tabela tem 12 linhas), mas todas as linhas ficam verdes, em vez de 4.O que estou fazendo de errado?

Foi útil?

Solução

O motivo é a infame memória de cores (TM) do DefaultTableCellEditor:você tem que definir as cores sempre, em vez de apenas em uma ramificação.

if (myCondition) {
   setBackground(...) {
} else {
   setBackground(...) 
} 

os detalhes exatos são explicados em um tópico recente

Outras dicas

Você pode usar XxxCellRenderer, mas melhor e mais fácil é usar prepareRenderer()

para o código correto você deve substituir ou testar dentro de if-else segue patameters

  • é selecionado

  • temFoco

  • coluna

  • linha

Mais em respostas e pergunta sobre um problema semelhante

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top