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…)
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.
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.
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.
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
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??? :?:
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.
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.