Question

J'ai un JTable avec 3 colonnes. J'ai mis le TableCellRenderer pour tous les 3 colonnes comme celui-ci (peut-être pas très efficace?).

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

Le getTableCellRendererComponent() retourne un composant avec une couleur de fond aléatoire pour chaque ligne.
Comment pourrais-je changer l'arrière-plan à une autre couleur aléatoire alors que le programme fonctionne?

Était-ce utile?

La solution

Une façon serait stocker la couleur courante pour chaque ligne dans le modèle. Voici un modèle simple qui est fixé à 3 colonnes et 3 lignes:

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

Notez que setRowColour appelle fireTableRowsUpdated; cela entraînera simplement cette ligne de la table à jour.

Le moteur de rendu peut obtenir le modèle de la table:

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

Changer la couleur d'une ligne serait aussi simple que:

model.setRowColour(1, Color.YELLOW);

Autres conseils

Resümee de la réponse de Richard Fearn, pour rendre chaque seconde gris ligne:

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

Les autres réponses données ici fonctionnent bien puisque vous utilisez le même dans chaque colonne renderer.

Cependant, je tends à croire que généralement lorsque vous utilisez un JTable vous aurez différents types de données dans chaque columm et donc vous ne serez pas en utilisant la même pour chaque colonne renderer. Dans ces cas, vous pouvez trouver ligne du tableau de rendu de l'approche helpfull .

Ceci est fondamentalement aussi simple que de repeindre la table. Je ne l'ai pas trouvé un moyen de repeindre sélectivement une seule ligne / colonne / cellule cependant.

Dans cet exemple, en cliquant sur le bouton change la couleur d'arrière-plan pour une ligne et appelle ensuite repeindre.

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

L'appel à getTableCellRendererComponent(...) comprend la valeur de la cellule pour laquelle on cherche un moteur de rendu.

Vous pouvez utiliser cette valeur pour calculer une couleur. Si vous utilisez également un AbstractTableModel, vous pouvez fournir une valeur de type arbitraire à votre moteur de rendu.

Une fois que vous avez une couleur, vous pouvez setBackground() sur le composant que vous retournez.

scroll top