Changer la couleur de fond d'une rangée dans un JTable
j'ai un JTable avec 3 colonnes. J'ai mis le TableCellRenderer
pour toutes les 3 colonnes comme ceci (peut-être pas très efficace?).
for (int i = 0; i < 3; i++) {
myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
getTableCellRendererComponent()
renvoie un composant avec une couleur de fond aléatoire pour chaque ligne.
Comment puis-je changer le fond en une autre couleur aléatoire pendant que le programme est en cours d'exécution?
5 réponses
une façon serait de stocker la couleur actuelle pour chaque ligne du 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
; il en résultera une mise à jour de cette ligne du tableau.
Le convertisseur pouvez 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 rangée serait aussi simple que:
model.setRowColour(1, Color.YELLOW);
résumé de la réponse de Richard Fearn, pour rendre chaque seconde ligne grise:
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 renderer dans chaque colonne.
cependant, j'ai tendance à croire que généralement en utilisant un JTable vous aurez différents types de données dans chaque colonne et donc vous n'utiliserez pas le même renderer pour chaque colonne. Dans ces cas, vous pouvez trouver le Ligne De La Table De Rendu approche utile.
c'est aussi simple que de repeindre la table. Je n'ai pas trouvé un moyen de repeindre sélectivement juste une rangée/colonne/cellule cependant.
dans cet exemple, cliquer sur le bouton change la couleur de fond pour une rangée et appelle 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 dont le rendu est demandée.
Vous pouvez utiliser cette valeur pour calculer une couleur. Si vous utilisez également un Abstracttablmodel, vous pouvez fournir une valeur de type arbitraire à votre renderer.
une Fois que vous avez une couleur, vous pouvez setBackground()
sur le composant que vous retournez.