2009-05-03 9 views
7

Dies macht mich absolut verrückt.Ändern der JTable-Zellenfarbe

Ich weiß, dass, um die Formatierung von Tabellenzellen mit JTable ändern, ich meinen eigenen Renderer verwenden muss. Aber ich kann das nicht richtig umsetzen.

Dies ist meine aktuelle Setup:

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

Was kann ich für den ersten Parameter von setDefaultRenderer verwenden? Die API sagt nur "Klasse". Ich habe keine Ahnung, was ich dort hinstellen soll.

Könnte jemand einfach erklären, wie ich das umsetze? Bitte geben Sie ein Beispiel, wie ich die Formatierung innerhalb der main() Methode auch ändern kann.

Antwort

13

Geben Sie im ersten Parameter für setDefaultRenderer das Klassenliteral für die Klasse ein, für die das Rendering außer Kraft gesetzt werden soll. Das heißt, wenn Ihre Daten alle Saiten bestehen, können Sie setzen

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

Wenn Ihre Daten auch von Werten mit BigDecimal oder Integer als Klassen besteht, müssen Sie diese Methode mehrmals für jede Klasse Typ aufrufen (BigDecimal.class oder Integer.class in jedem Fall).

Und schließlich, um die Hintergrundfarbe, die Sie dies in Ihrem Renderer tun zu ändern:

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

Wenn Sie einen Renderer schreiben, die alle Klassen einer Schnittstelle arbeiten sollten, müssen Sie auch das ändern getColumnClass Funktion Ihres Tischmodell und lassen sie es die Schnittstelle Klasse für alle Objekte zurück, die diese Schnittstelle implementieren:

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 Damit kann man einen Renderer für IColorable.class registrieren und muss nicht für jede Implementierung einen separaten Renderer registrieren.

+0

Dies scheint nicht für mich zu arbeiten. Das einzige, was ich getan habe, ist die Methode setDefaultRenderer aufzurufen und die Klasse CustomRenderer zu erstellen. Gibt es noch etwas, was ich tun muss, um das zu machen? –

+2

Ich habe es funktioniert mit Object.class statt String.class. Nicht sicher, warum dies notwendig war, weil alle meine Daten Strings waren. Vielen Dank für Ihre Hilfe! –

+0

Darf ich den Renderer in einem Listener nicht ändern? Ich möchte die Tabelle neu formatieren, wenn eine Taste gedrückt wird. –