una tabla seleccionar segun resaltar ponerle pintar personalizar las formato filas fila dar condicion como color celda cambiar java jtable tablecellrenderer

java - tabla - Cambiar el color de fondo de una fila en un JTable



resaltar fila jtable java (5)

Tengo un JTable con 3 columnas. He configurado TableCellRenderer para todas las 3 columnas como esta (¿quizás no sea muy efectiva?).

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 programa se está ejecutando?


Esto es básicamente tan simple como volver a pintar la tabla. 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 cambia el color de fondo de una fila y luego se vuelve a dibujar.

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 cual se busca un renderizador.

Puedes usar ese valor para calcular un color. Si también está utilizando un 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.


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

Sin embargo, tiendo a creer que, en general, al usar una tabla JT, 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 representación de filas de tablas .


Resuma 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; } });


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

static class MyTableModel extends DefaultTableModel { List<Color> 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 hará que solo 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);