ableCellRenderer

Morgaine21

Grünschnabel
Hallo Leute,

ich weiß zu diesem Thema gibt es unglaublich viele Einträge, jedoch hab ich jetzt schon ziemlich viele durch und komme immer noch auf kein Ergebnis.

Nun zu meinem Problem:

Ich möchte die Schriftfarbe der Zellen meiner JTable je nach Text ändern. Hierfür habe ich folgenden Code verfasst:

Code:
public class ScoreTableCellRender extends DefaultTableCellRenderer
 {
    private static final long serialVersionUID = 3503110144069061261L;

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        // TODO Auto-generated method stub
        JLabel c = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        String s = value.toString();
        
        if(s.equals("NB")){
            c.setForeground(Color.GRAY);
            c.setText((String) value);
        }
        else if(s.equals("NOK")){
            c.setForeground(Color.ORANGE);
            c.setText((String) value);
        }
        else if(s.equals("NNOK")){
            c.setForeground(Color.RED);
            c.setText((String) value);
        }
        else if(s.equals("OK")){
            c.setForeground(Color.BLACK);
            c.setText((String) value);
        }
        return c;
    }
}

Hier mein Modell:

Code:
public class StatistikTabellenModell extends AbstractTableModel{

    private static final long serialVersionUID = -2712404378541056977L;
    
    private int ColumnCount = 1;
    private int RowCount = 1;
    private String[][] Values;
    
    public StatistikTabellenModell(int c, int r)
    {
        ColumnCount = c;
        RowCount = r + 1;
    }

    public int getColumnCount() {
        // TODO Auto-generated method stub
        return ColumnCount;
    }

    public int getRowCount() {
        // TODO Auto-generated method stub
        return RowCount;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        // TODO Auto-generated method stub
        if(Values != null)
            return Values[rowIndex][columnIndex];
        else
            return " ";
    }
    
    public void setColumnCount(int i){
        ColumnCount = i;
        Values = new String[RowCount+1][ColumnCount];
    }
    
    public void setRowCount(int i){
        RowCount = i;
        Values = new String[RowCount+1][ColumnCount];
    }
    
    public void setValue(String[] d, String[][] a)
    {
        Values = new String[RowCount+1][ColumnCount];
        for(int i = 0; i < d.length; i++)
            Values[0][i] = d[i];
        
        for(int i = 0; i < a.length; i++){
            for (int j = 0; j < a[i].length; j++)
                Values[i+1][j] = a[i][j];
        }
    }
}

Und der Teil des Hauptprogramms der relavant ist:

Code:
ScoreTableCellRender str = new ScoreTableCellRender();
TAnzeigeModell2.setValue(ColDate, Values2);
TAnzeige2.setDefaultRenderer(String.class, str);

Ich hoffe wirklich, dass ihr mir helfen könnt und bedanke mich schon mal im Vorraus.

lg
Morgaine21
 
Howdie.

Und was genau ist jetzt dein Problem? Ist zwar ein lustiges Ratespiel, den Code auf Fehler zu checken, aber interessant wäre eine Fehlerbeschreibung ;)

Gruß
miffi
 
Hach ja, der gute CellRenderer... Ich hatte schon ähnliche Ansätze wie du und hab bis heute nicht verstanden, warum es auf diese Weise nicht funktioniert. Hab jetzt grad ein Projekt geöffnet, in dem ich einen CellRenderer benutze. Versuch mal direkt die Komponente zu benutzen, statt auf ein JLabel zu casten.
Mit deinem Beispiel:
Java:
public class ScoreTableCellRender extends DefaultTableCellRenderer
 {
    private static final long serialVersionUID = 3503110144069061261L;
 
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        // wichtig, trotzdem vorher die super-Methode aufrufen!
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        String s = value.toString();
        
        if(s.equals("NB")){
            this.setForeground(Color.GRAY);
            this.setText((String) value);
        }
        else if(s.equals("NOK")){
            this..setForeground(Color.ORANGE);
            this..setText((String) value);
        }
        else if(s.equals("NNOK")){
            this..setForeground(Color.RED);
            this..setText((String) value);
        }
        else if(s.equals("OK")){
            this..setForeground(Color.BLACK);
            this..setText((String) value);
        }
        return c;
    }
}

Dann würde ich dir nur noch empfehlen, einen else-Zweig hinzuzufügen, falls keine der Bedingungen zutrifft. Ist zwar durch deinen Code vermutlich unwahrscheinlich, aber falls der Fall zutrifft, bleibt die Komponente komplett weiß, auch der Text.

Gruß
miffi

//edit:
Falls es dann nicht funktioniert, wird vermutlich bereits ein Fehler beim Aufbau des Tables vorliegen. Fügst du dort selbst JLabels als Cell-Komponenten hinzu?
 
Hab JLabel jetzt geändert und auch den zusetzlichen else - Zweig eingefügt. Hast aber nichts geholfen.

Ich weiß nicht ob mein Modell stimmt. Den Text zeigt es ja richtig an. Sind allerdings keine JLabels sonders normal Strings. Siehe dazu meinen Code.

P.S.: Würde es vl funktionieren wenn ich HTML Code verwende? Also wenn ich im HTML die Color angebe. Würde dies dann richtig angezeigt werden oder der HTML-Code in Klarschrift.
 
Durchaus möglich, dass es an dem Model liegt. Warum benutzt du überhaupt ein eigenes? Du hast doch nur Standard-Methoden drin, oder?
Initialisiert du das Table mit dem Model, also myTable = new JTable(myModel) ?
Falls du nur ein Standard-Model brauchst, kannst du auch ein DefaultTableModel erzeugen und übergeben.

HTML wird hier nicht nötig sein. Man kann zwar auf vielen Swing-Komponenten HTML zur Gestaltung verwenden, aber beim JTable gibts ja für solche Geschichten extra Renderer und sowas.
 
Hallo,

ich habe das Problem nun gelöst.
Ich fange einfach alle NULL Werte ab und schon funktioniert es. Danke für die zahlreichen Tipps.

Das mit den DefaultModell wusste ich gar nicht. Ich verwendet trotzdem lieber ein eigenes, da da ich dann schneller Änderungen vornehmen kann.
 
Solche Probleme kannst du mit einem DefaultTableModel vermutlich umgehen. Du kannst ja Änderungen immer noch einfach durchführen, wenn du beispielsweise eine eigene Klasse von DefaultTableModel ableitest und die nötigen Methoden überschreibst.

Wenn das Problem erledigt ist, markier den Thread doch bitte als gelöst.
 

Neue Beiträge

Zurück