2013-08-15 7 views
5

Ho creato questa classe CustomCellRenderer da utilizzare negli oggetti JXTreeTable e JXTable poiché ne ho molti di questi nel mio progetto. Quindi questa classe implementa TreeCellRenderer e TableCellRenderer interfacce:Custom TableCellRenderer/TreeTableCellRenderer non esegue il rendering delle celle della tabella

public class CustomCellRenderer extends JLabel 
           implements TreeCellRenderer, TableCellRenderer { 

    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     setBackground(selected ? new Color(83,142,213) : Color.white); 
     setForeground(selected ? Color.white : Color.black); 
     //here is the icon setting code but it's irrelevant to my problem 
     setText(value != null ? value.toString() : "<null>"); 
     return this; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     setBackground(isSelected ? new Color(83,142,213) : Color.white); 
     setForeground(isSelected ? Color.white : Color.black); 
     setText(value != null ? value.toString() : "<null>"); 
     return this; 
    } 
} 

Ed ecco il codice in cui ho impostato il programma di rendering:

jXTreeTableConsumos.setDefaultRenderer(Object.class, new CustomCellRenderer()); 
jXTreeTableConsumos.setTreeCellRenderer(new CustomCellRenderer()); 

Mi aspetto sfondo e primo piano diventano blu e bianco, rispettivamente, quando una riga è selezionato. Tuttavia succede solo in cella di una tabella Albero (prima colonna), mentre solo le modifiche primo piano e sfondo alambicchi bianco nelle altre celle della stessa riga selezionata:

enter image description here

Qualcuno potrebbe per favore mi dica il motivo per cui le cellule (che sono non le celle degli alberi) non cambiano il loro colore di sfondo?

+0

senza entendi La pregunta – nachokk

+1

I don capisco, neanche; perché 'Object.class'? _che cosa non cambia in blu? Modifica la tua domanda per includere un [sscce] (http://sscce.org/) che mostra il problema che descrivi. – trashgod

risposta

7

Grazie a tutti per i vostri commenti e suggerimenti. Ho trovato la soluzione nella documentazione JComponent#setBackground(Color bg):

Imposta il colore di sfondo di questo componente. Il colore di sfondo è utilizzato solo se il componente è opaco e solo per sottoclassi di implementazioni di JComponent o ComponentUI. Sottoclassi dirette di JComponent deve eseguire l'override di paintComponent per onorare questa proprietà.

Dal momento che il mio CustomCellRenderer estende dalla JLabel l'unica cosa che devo fare è assicurarsi che sia opaco e il colore di sfondo sarà dipinto:

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    setOpaque(true);//adding this line I solved my problem 
    setBackground(isSelected ? new Color(83,142,213) : Color.white); 
    setForeground(isSelected ? Color.white : Color.black); 
    setText(value != null ? value.toString() : "<null>"); 
    return this; 
} 

enter image description here

+1

Ah, 'DefaultTableCellRenderer' è opaco per impostazione predefinita; può essere usato in questo contesto? – trashgod

+1

@trashgod grazie per il consiglio. Funziona anche! – dic19

Problemi correlati