JTable: colorir linha especifica

8 respostas
H

Seguinte, to fazendo esse panel da figura abaixo, ele tem uma “JTable” q mostra regras de firewall (iptables). Queria q qnd desmarcasse o “JCheckBox”, a linha dele fosse colorida de vermelho, e qnd marcasse a linha fosse colorida da cor normal q estava (branco ou cinza). So q eu n to sabendo fazer isso, rodeio q so ja e nd, ja li o tutorial da Sun de capo a rabo e nd ainda. Alguem poderia me sugerir como desenrrolar? Vlw…



8 Respostas

RaulCarlin

Crie uma classe que extende DefaultTableCellRenderer, ou instancie ela sobreescrevendo o método abaixo, tipo:

DefaultTableCellRenderer = new DefaultTableCellRenderer() {
// o método abaixo
}
@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

                 // Faz a verificação com o getValueAt()...
                comp.setBackground(Color.GRAY);
                comp.setForeground(Color.BLACK);

		return comp;
	}

Depois na sua table utuilize setDefaultRenderer(seuRenderer).

H

Seguinte, consegui, vlw, mas ficou qse 100%, pois ele nao ta mudando de cor qnd “marca/desmarca” o checkBox e sim qnd “marca/desmarca e muda a linha”, ou seja o render n ta atualizando exatmente na hr q “marca/desmarca” o checkBox e sim qnd “muda a linha”. Ficou legal, mas ficaria melhor se ele mudasse qnd “marcar/desmarcar” o checkBox. Nao to desenrrolando isso, se alguem souber, me fala, vlw…O codigo ficou assim:

//criando o render
        DefaultTableCellRenderer dtcr =
                new DefaultTableCellRenderer() {
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {  
                        Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);  
   
                        boolean result = (Boolean)table.getValueAt(row, 0);
                        if (!result) {
                            comp.setBackground(Color.RED);  
                            comp.setForeground(Color.BLACK);  
                        } else if (row % 2 == 0) {
                             comp.setBackground(Color.LIGHT_GRAY);
                             comp.setForeground(Color.BLACK);
                          } else {
                                comp.setBackground(Color.WHITE);
                                comp.setForeground(Color.BLACK);
                            }
                          
                        return comp;  
                    }  
            
                    /*public void setValue(Object value) {
                        int i = 0;
                        if (i%2 == 0) {
                            setBackground(Color.LIGHT_GRAY);  
                            setForeground(Color.WHITE); 
                        }
                        super.setValue(value); 
                    }*/
                };
                
        //setando o render para qualquer objeto da jTable
        jTable1.setDefaultRenderer(Object.class, dtcr);
M

Na listener da sua tabela, você está atualizando??

H

nao coloquei nenhum evento na tabela nao. mas o metodo q executa o codigo acima está sendo chamado no inicio do programa. ele ta atualizando, so q so atualiza qnd marca o checkBox e muda a linha (acho q eh nesse momento q o render atua) e nao apenas qnd o checkBox eh marcado.

esse evento seria p por onde?

M

Bom, eu uso tablmodellistener!!Para que ele atualize a minha tabela!!

RaulCarlin

Pergunta:

Quando clica na CheckBox, a linha fica com a cor de seleção padrão (tipo azul no Metal…)? Se sim, ela está sobrepondo a sua, basta usar o setSelectedBackground() e voltar ao normal depois que sair da seleção…

H

qnd seleciona o checkBox, ta azul sim. mas acho q vc entendeu errado. o problema nao eh a cor do checkbox, isso ta ok. o problema eh q qnd desmarco o checkBox, a linha da JTable nao fica vermelha imediatamente, ela so passa a ficar vermelha qnd a selecao sai dela, ou seja, qnd eu seleciono outra linha. entendeu agora?

RaulCarlin

Sim mas é da linha toda que estou dizendo…

O que ocorre é que o JTable tem uma cor para a linha selecionada e outra para a não selecionada, você tem que sobreescrever isso, para que o elemento mude para a cor que você deseja mesmo quando selecionado…

Entendeu agora?

Criado 31 de março de 2008
Ultima resposta 7 de abr. de 2008
Respostas 8
Participantes 3