Pregunta

Tengo un JTable con 3 columnas. He puesto el TableCellRenderer para todas las 3 columnas como esta (tal vez no muy eficaz?).

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

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

¿Fue útil?

Solución

Una forma sería almacenar el color actual para cada fila dentro del modelo. Aquí está 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 fireTableRowsUpdated; esto hará que solo esa fila de la tabla que se actualiza.

El procesador 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;
    }
}

El cambio de color de una fila sería tan simple como:

model.setRowColour(1, Color.YELLOW);

Otros consejos

REANUDARÁN de la respuesta de Richard Fearn, para hacer de cada segundo gris línea:

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 demás respuestas que se dan aquí funciona bien ya que se utiliza el mismo procesador en cada columna.

Sin embargo, tiendo a creer que por lo general cuando se utiliza un JTable que tendrá diferentes tipos de datos en cada columm y por lo tanto no va a utilizar el mismo procesador para cada columna. En estos casos es posible que el enfoque Tabla fila de representación de atento .

Esto es básicamente tan simple como volver a pintar la mesa. No he encontrado una manera de pintar de manera selectiva sin embargo, sólo una fila / columna / celda.

En este ejemplo, al hacer clic en el botón cambia el color de fondo de una fila y luego llama a pintar.

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 célula para la que se solicita un procesador.

Puede utilizar este valor para calcular un color. Si también está usando un AbstractTableModel, puede proporcionar un valor de tipo arbitrario a su procesador.

Una vez que tenga un color, se puede setBackground() en el componente que usted está volviendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top