Colorir Células com TableCellRenderer

14 respostas
P
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:
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;
  }

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

14 Respostas

P

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.

I

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

P

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!

E

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.

P

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.

P

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:

M

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

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:

P

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??? :?:

I

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:

P

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?

I

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:

P

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

I

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:

Criado 1 de dezembro de 2012
Ultima resposta 25 de jan. de 2013
Respostas 14
Participantes 4