TableCellRenderer usando dados de outra célula
-
21-12-2019 - |
Pergunta
Eu tenho jTable1
com 2 colunas.Quero controlar a aparência da coluna 1, então uso o código a seguir para definir a fonte do texto nas células em negrito ou não, com base no fato de a linha das células ser par ou ímpar.
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column );
if (row % 2 == 0){
cell.setFont(getFont().deriveFont(Font.BOLD));
}
return cell;
}
}
Eu chamo isso usando:
jTable1.getColumnModel().getColumn(1).setCellRenderer(new
CustomTableCellRenderer());
O que eu quero é modificar isso TableCellRenderer
para que o fundo das células seja pintado com base no valor da outra coluna (coluna 0) na mesma linha.Por exemplo, se o valor na coluna0, linha 5 for "livro", a célula da coluna1, linha 5 será vermelha e se o valor da coluna0 for "jornal", a cor da coluna1 será verde.Meu problema é que não sei como passar o valor da coluna0 para o renderizador da coluna1 para que ele seja usado para alterar as cores.
Solução 3
Encontrei como acessar os dados de outra coluna:
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class CustomTableCellRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent (JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column );
//I USE THIS TO ACCESS THE DATA FROM ANOTHER CELL!!!
TableModel model = table.getModel();
String media= (String) model.getValueAt(row, 0)
if (row % 2 == 0){
cell.setFont(getFont().deriveFont(Font.BOLD));
}
//SO I GET THE RESULT I WANT
if ("book".equals(media)){
cell.setBackground(Color.red)
}
else{
cell.setBackground(Color.green)
}
return cell;
}
}
Outras dicas
Verifique a assinatura do .getTableCellRendererComponent(...)
método:você está obtendo uma referência ao JTable (do qual você pode obter o TableModel) e o índice da linha e coluna atuais.
Usando-os, você pode procurar qualquer valor relativo desejado.
Como mostrado aqui, você pode substituir prepareRenderer()
para afetar linhas inteiras.