Cambiar el color de fondo de una fila en una JTable

Tengo una JTable con 3 columnas. Establecí TableCellRenderer para las 3 columnas como esta (¿quizás no muy efectivo?).

  for (int i = 0; i < 3; i++) { myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer); } 

El getTableCellRendererComponent() devuelve un componente con un color de fondo aleatorio para cada fila.
¿Cómo podría cambiar el fondo a otro color aleatorio mientras el progtwig se está ejecutando?

Una forma sería almacenar el color actual para cada fila dentro del modelo. Aquí hay un modelo simple que se arregla en 3 columnas y 3 filas:

 static class MyTableModel extends DefaultTableModel { List rowColours = Arrays.asList( Color.RED, Color.GREEN, Color.CYAN ); public void setRowColour(int row, Color c) { rowColours.set(row, c); fireTableRowsUpdated(row, row); } public Color getRowColour(int row) { return rowColours.get(row); } @Override public int getRowCount() { return 3; } @Override public int getColumnCount() { return 3; } @Override public Object getValueAt(int row, int column) { return String.format("%d %d", row, column); } } 

Tenga en cuenta que setRowColour llama a fireTableRowsUpdated ; esto causará que esa fila de la tabla se actualice.

El renderizador puede obtener el modelo de la tabla:

 static class MyTableCellRenderer extends DefaultTableCellRenderer { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { MyTableModel model = (MyTableModel) table.getModel(); Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); c.setBackground(model.getRowColour(row)); return c; } } 

Cambiar el color de una fila sería tan simple como:

 model.setRowColour(1, Color.YELLOW); 

Reanudar la respuesta de Richard Fearn, para hacer que cada segunda línea sea gris:

 jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE); return c; } }); 

Las otras respuestas dadas aquí funcionan bien, ya que usa el mismo procesador en cada columna.

Sin embargo, tiendo a creer que, en general, al usar una JTable, tendrá diferentes tipos de datos en cada columna y, por lo tanto, no usará el mismo procesador para cada columna. En estos casos, puede encontrar útil el enfoque de Renderización en fila de tabla .

Esto es básicamente tan simple como volver a pintar la mesa. Sin embargo, no he encontrado una forma de volver a pintar selectivamente solo una fila / columna / celda.

En este ejemplo, al hacer clic en el botón se cambia el color de fondo de una fila y luego se repite la llamada.

 public class TableTest { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final Color[] rowColors = new Color[] { randomColor(), randomColor(), randomColor() }; final JTable table = new JTable(3, 3); table.setDefaultRenderer(Object.class, new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JPanel pane = new JPanel(); pane.setBackground(rowColors[row]); return pane; } }); frame.setLayout(new BorderLayout()); JButton btn = new JButton("Change row2's color"); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rowColors[1] = randomColor(); table.repaint(); } }); frame.add(table, BorderLayout.NORTH); frame.add(btn, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } private static Color randomColor() { Random rnd = new Random(); return new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); } } 

La llamada a getTableCellRendererComponent(...) incluye el valor de la celda para la que se busca un procesador.

Puede usar ese valor para calcular un color. Si también está utilizando AbstractTableModel, puede proporcionar un valor de tipo arbitrario a su procesador.

Una vez que tenga un color, puede establecer setBackground() en el componente que está devolviendo.