java - tabla - Tratando de colorear las filas específicas de JTable usando Custom Renderer, en cambio todas mis filas están coloreadas
resaltar fila jtable java (2)
para mi programa Java, básicamente, cuando el valor en la columna 4 de mi JTable es mayor que la columna 3, quiero que esas filas específicas se coloreen en rojo y no en las otras filas.
He implementado el siguiente código, pero por alguna razón todas mis filas se están coloreando en rojo en lugar de solo las que coinciden con los criterios.
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int Value1= Integer.parseInt(table.getModel().getValueAt(row, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
if (Value2>=Value1) {
setBackground(Color.red);
}
return this;
}
});
¿Alguna sugerencia / sugerencia sobre cómo solucionar esto?
Eche un vistazo a Table Row Rendering que muestra cómo hacerlo al reemplazar el prepareRenderer(...)
de JTable.
Usando este enfoque, no necesita un procesador personalizado para cada tipo de datos en la tabla.
Una instancia de DefaultTableCellRenderer
utiliza un componente de plantilla para representar todas las celdas (es decir, sí mismo, ver documentación). Una vez que establezca su color, la plantilla tendrá ese color y se aplicará a todas las celdas siguientes.
Lo que tiene que hacer es su lógica, establecer el color en rojo en los casos que necesite y configurarlo en el color de fondo predeterminado en todos los demás casos.
if(!isSelected) {
if (Value2>=Value1) {
setBackground(Color.red);
} else {
setBackground(table.getBackground()); // or use another color for another background
}
}
Mirando su código nuevamente, me doy cuenta de que está cometiendo un error con respecto a los índices de modelo frente a vista. El método getTableCellRendererComponent
se llama con índices de vista, pero los está usando para indexar el modelo (por ejemplo, en table.getModel().getValueAt(row, 3)
). Cuando su tabla esté ordenada, los resultados serán incorrectos ya que los índices del modelo y los índices de vista serán diferentes.
Si necesita obtener valores del modelo, primero debe convertir los índices de vista a índices de modelo. Utilice JTable.convertRowIndexToModel
y JTable.convertColumnIndexToModel
para hacer eso. P.ej:
int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());