2009-05-03 6 views
7

Cela me rend absolument fou.Changement de couleur de cellule JTable

Je sais que, pour changer la mise en forme des cellules de tableau avec JTable, je dois utiliser mon propre moteur de rendu. Mais je n'arrive pas à l'appliquer 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 juste "class". Je n'ai aucune idée de ce qu'il faut mettre là.

Quelqu'un pourrait-il expliquer, dans les termes les plus simples, comment je vais mettre en œuvre cela? Veuillez fournir un exemple de comment modifier la mise en forme à l'intérieur de la méthode main().

Répondre

13

Dans le premier paramètre pour setDefaultRenderer, placez le littéral de classe pour la classe que vous souhaitez remplacer le rendu. Par exemple, si vos données sont toutes constituées de chaînes, vous pouvez mettre

myTable.setDefaultRenderer(String.class, new CustomRenderer()); 

Si vos données se compose également de valeurs avec BigDecimal ou Integer en cours, vous devez invoquer 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 que vous faites 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 getColumnClass fonction de votre modèle de table et laissez revenir la classe d'interface pour tous les objets qui mettent en œuvre 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(); 
    } 
} 

Wi ce que l'on peut enregistrer un rendu pour IColorable.class et n'a pas besoin d'enregistrer un moteur de rendu séparé pour chaque implémentation.

+0

Cela ne semble pas fonctionner pour moi. La seule chose que j'ai faite est d'invoquer la méthode setDefaultRenderer et de créer la classe CustomRenderer. Y a-t-il autre chose que je dois faire pour que cela fonctionne? –

+2

Je l'ai fait en utilisant Object.class au lieu de String.class. Je ne sais pas pourquoi cela était nécessaire, car toutes mes données étaient des chaînes. Nous vous remercions de votre aide! –

+0

Est-ce que je ne suis pas autorisé à changer le moteur de rendu dans un écouteur? Je veux re-formater la table quand un bouton est pressé. –

Questions connexes