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 () .

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top