2009-05-03 22 views
7

Questo mi sta facendo impazzire.Cambiare il colore della cella JTable

So che, per modificare la formattazione delle celle di tabella con JTable, devo usare il mio riproduttore. Ma non riesco a implementarlo correttamente.

Questa è la mia messa a punto corrente:

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

cosa ho bisogno di utilizzare per il primo parametro di setDefaultRenderer? L'API dice solo 'classe'. Non ho idea di cosa mettere lì.

Qualcuno potrebbe semplicemente spiegare, nel modo più semplice, come procedo con l'implementazione di questo? Si prega di fornire un esempio di come posso modificare la formattazione anche all'interno del metodo main().

risposta

13

Nel primo parametro per setDefaultRenderer, inserire la classe letterale per la classe che si desidera sovrascrivere il rendering. Vale a dire, se i dati sono costituiti da tutte le stringhe, si può mettere

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

Se i dati si compone anche di valori con BigDecimal o Integer come classi, si deve richiamare il metodo più volte per ogni tipo di classe (BigDecimal.class o Integer.class in ogni caso).

E, infine, per cambiare il colore di sfondo si esegue questa operazione nel vostro renderer:

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

Se si scrive un renderer che dovrebbe funzionare per tutte le classi di un'interfaccia, sarà inoltre necessario modificare la getColumnClass funzione del vostro modello di tavoloche torna la classe di interfaccia per tutti gli oggetti che implementano questa interfaccia:

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 questo è possibile registrare un renderer per IColorable.class e non è necessario registrare un renderer separato per ogni implementazione.

+0

Questo non sembra funzionare per me. L'unica cosa che ho fatto è invocare il metodo setDefaultRenderer e creare la classe CustomRenderer. C'è qualcos'altro che devo fare per farlo funzionare? –

+2

Ho funzionato usando Object.class anziché String.class. Non sono sicuro del motivo per cui questo è stato necessario, però, perché tutti i miei dati erano stringhe. Grazie per il vostro aiuto! –

+0

Non sono autorizzato a modificare il renderer all'interno di un listener? Voglio riformattare la tabella quando viene premuto un pulsante. –

Problemi correlati