2013-08-15 14 views
5

Ich habe diese CustomCellRenderer Klasse für die Verwendung in JXTreeTable und JXTable Objekte erstellt, da ich viele davon in meinem Projekt habe. So implementiert diese Klasse TreeCellRenderer und TableCellRenderer Schnittstellen:Benutzerdefinierter TableCellRenderer/TreeTableCellRenderer rendert keine Tabellenzellen

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

Und hier ist der Code, wo ich den Renderer gesetzt:

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

Ich erwarte Hintergrund und Vordergrund werden blau und weiß jeweils, wenn eine Zeile ist ausgewählt. Allerdings kommt es nur an den Tree Tabellenzelle (erste Säule), während nur Vordergrund Änderungen und Hintergrund stillen weiß in den anderen Zellen in der gleichen ausgewählten Zeile:

enter image description here

Könnte jemand bitte sagen Sie mir, warum Zellen (das ist nicht Baumzellen) nicht ihre Hintergrundfarbe ändern?

+0

kein entendi la pregunta – nachokk

+1

I don verstehe auch nicht; Warum 'Objekt.Klasse'? _what_ ändert sich nicht zu blau? Bitte bearbeiten Sie Ihre Frage so, dass sie ein [sscce] (http://sscce.org/) enthält, das das von Ihnen beschriebene Problem aufweist. – trashgod

Antwort

7

Vielen Dank für Ihre Kommentare und Vorschläge. Ich fand die Lösung in JComponent#setBackground(Color bg) Dokumentation:

Setzt die Hintergrundfarbe dieser Komponente. Die Hintergrundfarbe ist nur verwendet, wenn die Komponente undurchsichtig ist, und nur von Unterklassen von JComponent oder ComponentUI-Implementierungen. Direkte Unterklassen von JComponent muss paintComponent überschreiben, um diese Eigenschaft zu berücksichtigen.

Da mein CustomCellRenderer erstreckt sich von JLabel das einzige, was ich tun muss, ist sicherzustellen, dass es undurchsichtig und seine Hintergrundfarbe lackiert werden:

@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' ist standardmäßig undurchsichtig; Kann es in diesem Zusammenhang verwendet werden? – trashgod

+1

@trashgod danke für den Rat. Es funktioniert auch! – dic19