Supongamos que la celda que desea representar con un color diferente representa un estado (tomaré Rechazado y Aprobado como ejemplos). Luego implementaría un método en mi modelo de tabla llamado getStatus (int row) que devuelve el estado de cualquier fila determinada.
Luego, cuando esté en su lugar, crearé un procesador de células responsable de representar la columna a la que pertenece la celda. El procesador de celda sería algo en las líneas del código siguiente.
public class StatusColumnCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
//Cells are by default rendered as a JLabel.
JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
//Get the status for the current row.
CustomTableModel tableModel = (CustomTableModel) table.getModel();
if (tableModel.getStatus(row) == CustomTableModel.APPROVED) {
l.setBackground(Color.GREEN);
} else {
l.setBackground(Color.RED);
}
//Return the JLabel which renders the cell.
return l;
}
Entonces, cuando el procesador está en su lugar, simplemente "aplicar" el procesador a la mesa con el siguiente fragmento de código:
Table.getColumnModel().getColumn(columnIndex).setCellRenderer(new StatusColumnCellRenderer());
Con respecto a la preparación de una célula editable, sólo tiene que poner en práctica el isCellEditable (int rowIndex, int columnIndex) método en su modelo de tabla. También necesita implementar el método setValueAt (valor del objeto, int rowIndex, int columnIndex) si desea mantener el valor que proporciona el usuario (¡que supongo que tiene!).
alternativa: También puede evitar la realización del procedimiento getStatus() en su modelo de mesa si lo prefiere. Digamos, si getValueAt (int rowIndex, int columnIndex) de su modelo de tabla devuelve los estados como cadenas ("APROBADO", "RECHAZADO") entonces simplemente podría tener el renderizado para verificar el valor proporcionado [...] RendererComponent (tabla, valor) , boolean [...]) y cambia el color de la celda en función de eso. Entonces no necesitaría tomar el "desvío" al modelo de tabla para obtener el estado de la fila/columna actual. Esta podría ser la forma más fácil de hacerlo ... – sbrattla
Una última pequeña nota: si busca la solución en la que implementa getStatus (int row), asegúrese de convertir el índice de filas utilizando table.convertRowIndexToModel (int row) La fila proporcionada a getTableCellRendererComponent() es el índice de vista, que puede ser diferente del índice del modelo si el orden de las filas se cambia debido a la clasificación. – sbrattla