DefaultTableCellRenderer (Foreground, selektierte Zeile)

babuschka

Top Contributor
Hallo!

Vielleicht gibt es doch eine Lösung und jemand kennt sie...

Ich verwende eine JTable und habe eine Datumsspalte, in welcher innerhalb einer Mitgliederliste
das Datum der Flugtauglichkeit angezeigt wird. Sofern ein Pilot nicht mehr tauglich ist, wird das Datum in rot dargestellt. Nur wenn eine Zeile selektiert ist, möchte ich das nicht. Wie kann ich das machen?

Diese Frage ergibt sich insbesondere, weil ich künftig in meinen Tabellen die Werte der Spalte, nach welcher sortiert wird in bau darstellen möchte. Da die Farbe der selektierten Zeilen ebenfalls blau ist, müsste ich in diesem Fall nur den Wert der Zelle, welche selektiert ist und in der Sortierspalte liegt, anders darstellen. Zum Beispiel in weiß. Denn blaue Schrift auf blauem Hintergrund macht sich nicht gut.
Mein Code:
(Das
Code:
setText(lib.UtilDateTime.getDateString((Date)value, DateFormat.MEDIUM));
sorgt lediglich für eine gezielt formatierte Ausgabe des Datumwertes.)

Code:
class TableCellRendererMedicaldate extends DefaultTableCellRenderer
{
    @Override
    public void setValue(Object value) {
        if (value instanceof Date) {
            if ((Date)value != null) {
                Date medicaldate = (Date)value;
                if (medicaldate.compareTo(new Date()) < 0) setForeground(Color.RED);
                else setForeground(new Color(26, 26, 26)); // deault black
            }
            setText(lib.UtilDateTime.getDateString((Date)value, DateFormat.MEDIUM));
        }
        else super.setValue(value);
    }
}

Ich hoffe, es gibt einen Weg...

Grüße
JAR
 

KrokoDiehl

Top Contributor
Es gibt bei der JTable die Methode
Code:
getSelectionForeground()
(analog mit Hintergrund). Hier kriegst du die Standardfarbe heraus.
Generell läuft das Einfärben im TableCellRenderer nach dem Schema:
Java:
if (isSelected)
{
    // Färben einer selektierten Zelle
    comp.setForeground( table.getSelectionForeground() );
    comp.setBackground( table.getSelectionBackground() );
}
else
{
    if (valueMustBeColored)
    {  
        // eigene Färbung
        comp.setForeground( myForeground );
        comp.setBackground( myBackground );
    }    
    else
    {  
        // normale Färbung     
        comp.setForeground( table.getForeground() );
        comp.setBackground( table.getBackground() );
    }
}
 

Michael...

Top Contributor
besser die Methode getTableCellRendererComponent anstelle von setValue() überschreiben.
und darin super.getTableCellRendererComponent aufrufen, dann werden solche Sachen wie Schriftfarbe und Hintergrund im Falle einer Selektion automatisch gesetzt.
 

babuschka

Top Contributor
Danke, ich habs!

So sieht es aus:
Code:
class TableCellRendererMedicaldate extends DefaultTableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (isSelected)
            setForeground(table.getSelectionForeground());
        else {
            if (value instanceof Date) {
                if ((Date)value != null) {
                    Date medicaldate = (Date)value;
                    if (medicaldate.compareTo(new Date()) < 0) setForeground(Color.RED);
                    else setForeground(table.getSelectionForeground());
                }
                setText(lib.UtilDateTime.getDateString((Date)value, DateFormat.MEDIUM));
            }
            else super.setValue(value);
        }
        return this;
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben