Colorir Células com TableCellRenderer

Tenho um problema chato… estou fazendo comparações linha a linha, mas só a última é pintada, eu faço:

colorButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { for(int i =0;i<minhaJTable.getRowCount();i++){ atualizarCores(i); }
E o atualizar cores:

public void atualizarCores(int i){ ´´´ BigDecimal minimo= new BigDecimal(model.getValueAt(i,6).toString()); BigDecimal maximo= new BigDecimal(model.getValueAt(i,7).toString()); if(minimo.compareTo(media)<0){ TableCellRenderer tcr = new ColorirVermelho(i); TableColumn column = table.getColumnModel().getColumn(6); column.setCellRenderer(tcr); }else if(minimo.compareTo(media)>0){ TableCellRenderer tcr = new ColorirAzul(i); TableColumn column = table.getColumnModel().getColumn(6); column.setCellRenderer(tcr); } if(maximo.compareTo(media)>0){ TableCellRenderer tcr = new ColorirAzul(i); TableColumn column = table.getColumnModel().getColumn(7); column.setCellRenderer(tcr); }else if(maximo.compareTo(media)<0){ TableCellRenderer tcr = new ColorirVermelho(i); TableColumn column = table.getColumnModel().getColumn(7); column.setCellRenderer(tcr); } table.updateUI(); }
A classe que pinta:

[code]
class ColorirAzul extends DefaultTableCellRenderer{
private static final long serialVersionUID = -4187163147076513197L;
int selectedRow=-1;
public ColorirAzul(int row){
super();
this.selectedRow=row;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column){
Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(selectedRow!=-1){
if(selectedRow==row){
((JLabel) cell).setHorizontalAlignment(SwingConstants.CENTER);
cell.setFont(new Font(“Serif”, Font.BOLD, 12));
cell.setForeground(Color.BLUE);
((JLabel) cell).setText(value.toString());
}else{
cell.setForeground(Color.BLACK);
}
}
return this;
}

}[/code]
Mostrei uma parte do código, ele funciona individualmente.Mas se tiverem 10 linhas, só as células da última linha é pintada, se tiver 3, só a última, sempre a última fica pintada.Quero comparar e deixar pintadas as células de todas as linhas… alguma idéia???

Um detalhe que eu esqueci:
Eu quero que pinte somente quando colorButton for pressionado.Nesse caso que eu estou usando, além de só estar atualizando(pintando) as células última linha da JTable(era para pintar as células da posição 6 e 7 de TODAS as linhas), ainda dá uns comportamentos bizarros, como mudar a cor ao editar a célula(Isso só deve acontecer quando eu pressionar o botão para comparar…) :cry:

Aceito qualquer dica(mesmo que seja com uma diferente abordagem…). Obrigado.

Cara, uma opção é passar o seu colorButton para o renderer e assim lidar quando ele for pressionado.Isso de só pintar o último é pq todos estão sendo pintados, mas apenas o último está sendo exibido pintado.Passe um array com as linhas fazendo uma comparação.Pare evitar a bagunça das células a cada edição, talvez seja necessário forçar o renderer para não bagunçar nada fora do que esta sendo pintado.No seu Renderer, fora do if de comparação, faça algo do tipo:

cell.setFont(this.suaFontePadrao); cell.setForeground(Color.black); cell.setBackground(Color.white);
Para vc não ter problemas com os campos fora das colunas que são objeto de comparação.

Esse tópico pode lhe ajudar:
http://www.guj.com.br/java/63893-colorir-linha-especifica-em-jtable

Iron,
você sabe algum outro meio de comparar as células e pintar somente quando eu apertar o botão?Não tá dando…ao editar já pinta…acho que isso é padrão do Renderer.

aceito qualquer sugestão!

Esse é um problema clássico que ocorre porque as pessoas não entendem como é que funciona o TableCellRenderer, ou o paintComponent.

O que acontece é que quando a JTable é redesenhada (talvez porque você chamou fireTableCellChanged ou coisa parecida, ou então porque você esta usando um TableModel que força o redesenho da tabela quando você atualiza os dados) ele chama seu TableCellRenderer. É exatamente ao contrário que você estava imaginando (ou seja, você ficar mexendo em tempo de execução no TableCellRenderer não vai adiantar muito).

E é por isso que ele repinta quando você vai editando, não quando você quer.

Você precisa pensar ao contrário.

Eu comecei a programar há poucos meses, não entendo algumas coisas do Java!
Só quero comparar as células das colunas 6 e 7 de cada linha com um valor armazenado, se for maior, pinta de azul o numero, se for menor, de vermelho ao apertar o botão. Não entendo o porquê é tão dificil.

Em nenhum momento eu chamo um método fireXXX… Apenas ativo o renderer dentro do JButton e dentro da classe que extende DefaultTableCellRenderer eu faço tudo(comparar e pintar), como li aqui: http://www.guj.com.br/java/231183-mudar-cor-celula-jtable

Mas nada funciona legal… :cry:

Aqui eu pinto celulas depedendo da condição, pode fazer o mesmo ao clicar no botao.


jTable1.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            public Component getTableCellRendererComponent(JTable table, Object value,  
                    boolean isSelected, boolean hasFocus, int row, int column) {  
               
                Component cell2 = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                Object ref2 = table.getValueAt(row, jcoluna_setup);//  jcoluna_setup é um 'int' com a numeracao da coluna
                Object ref = table.getValueAt(row, jcoluna_percentual);//coluna percentual
                
                if (ref2 != null && Integer.parseInt(ref2.toString().substring(3, 5)) &gt;= 05 && column == jcoluna_setup) {  
                    cell2.setForeground(Color.WHITE);
                    cell2.setBackground(Color.red);
                }
                else if (ref != null && Integer.parseInt(ref.toString().substring(0, 2)) &lt;= 75 && column == jcoluna_percentual) {  
                        cell.setForeground(Color.WHITE);
                        cell.setBackground(Color.red);
                }
                else {  
                    cell2.setForeground(Color.BLACK);
                    cell2.setBackground(Color.WHITE);
                } 
                    return this;}
    }); 

marcospaulo.suporte,
você cai na mesma coisa que eu.Se suas células são editáveis, quando pressionar o JButton e o renderer for ativado, pinta toda hora que editar uma célula.

Gostaria de saber o que o entanglement, quis dizer com pensar ao contrário, tudo que eu pesquiso cai no CellRenderer… :oops:

Dei uma boa pesquisada, mas ainda não consegui… :oops:
Alguém sabe como desativar um renderer e reativar a cada ação?
Ou como fazer um paintComponent pintar uma célula da jtable??? :?:

PaulH,
para de chorar! :lol:

No botão, após usar o Renderer, desative o mesmo usando aquele Renderer que não interfere nas células quando você está editando, que por sinal, você pegou de mim. :wink:

Não foi Iron… continua bagunçando tudo :oops: :cry:

entanglement,
você sabe o caminho de como fazer para pintar as células das linhas da JTable após pressionar o botão sem usar TableCellRenderer?

PaulH,
o entanglement pode nem saber resolver o seu problema.O que ele disse é que seguindo os passos que você está fazendo, não funcionará. :wink:
Você precisa entender como Renderers e Editores trabalham e a forma de pintar as GUIs pelo java.
Leia um pouco isso:
http://www.oracle.com/technetwork/java/painting-140037.html
http://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html

Tô muito ocupado essa semana, se não conseguir resolver, na próxima eu dou uma olhada para você. :wink:

Iron, ainda não consegui resolver…pode dar uma mão? :cry:

Para sua sorte, caiu um requisito aqui que é exatamente o que você precisa.Tô vendo outras coisas na minha lista aqui, mas quando eu fizer posto aqui.O ideal é deixar essa mudança das cores com o TableModel, o que eu entendo que vocÊ não está conseguindo fazer, até porquê você utiliza o ObjectTableModel do Towell.Depois eu sento aqui e penso como fazer isso, pois tenho outras de mandas aqui. :wink: