Changer la couleur de la cellule JTable
-
03-07-2019 - |
Question
Cela me rend absolument fou.
Je sais que, pour modifier le formatage des cellules de tableau avec JTable, je dois utiliser mon propre moteur de rendu. Mais je n'arrive pas à mettre cela en œuvre correctement.
Voici ma configuration actuelle:
public class MyClass
{
public static void main(String args[])
{
JTable myTable = new JTable(10, 10);
myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
}
}
class CustomRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
// Formatting
return c;
}
}
Que dois-je utiliser pour le premier paramètre de setDefaultRenderer
? L'API dit simplement 'classe'. Je ne sais pas quoi mettre là.
Quelqu'un pourrait-il simplement expliquer, en termes simples, comment je vais mettre en œuvre cela? Veuillez fournir un exemple de la manière dont je peux modifier la mise en forme à partir de la méthode main ()
.
La solution
Dans le premier paramètre de setDefaultRenderer
, insérez le littéral de classe correspondant à la classe que vous souhaitez remplacer par le rendu. Par exemple, si vos données sont constituées de toutes les chaînes, vous pouvez mettre
myTable.setDefaultRenderer(String.class, new CustomRenderer());
Si vos données comprennent également des valeurs avec BigDecimal
ou Entier
en tant que classes, vous devez appeler cette méthode plusieurs fois pour chaque type de classe ( BigDecimal.class
ou Integer.class
dans chaque cas).
Et enfin, pour changer la couleur de fond, faites ceci dans votre moteur de rendu:
class CustomRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground(new java.awt.Color(255, 72, 72));
return c;
}
}
Si vous écrivez un moteur de rendu qui devrait fonctionner pour toutes les classes d'une interface , vous devrez également modifier la fonction getColumnClass
de votre modèle de table et laissez-le renvoyer la classe d'interface pour tous les objets qui implémentent cette interface:
public Class<? extends Object> getColumnClass(int c) {
Object object = getValueAt(0, c);
if(object == null) {
return Object.class;
if(getValueAt(0, c) instanceof IColorable) {
return ICarPart.class;
} else {
return getValueAt(0, c).getClass();
}
}
Avec cela, on peut enregistrer un moteur de rendu pour IColorable.class et il n'est pas nécessaire d'enregistrer un moteur de rendu distinct pour chaque implémentation.