jTable und farbige Spalten

Timo.

Mitglied
Hallo zusammen,

ich bin gerade dran ein kleines Programm zur Überwachung von Überweisungen zu schreiben.
Beim starten des Programms werden die offenen Überweisungen aus der Datenbank geladen und in einen Vector geschrieben. Dieser Vector wird dann mit der Methode setDataVector(...) dem TableModerl übergeben, das ich zuvor erstellt habe. Soviel dazu. Die Daten werden in der jTable ausgegeben. Zur Erinnerung daran, das die Überweisungen rechtzeitig getätigt werden, kann ich einen Wert setzen, der so und so viel Tage davor warnt das noch ausstehende Überweisungen getätigt werden müssen.

Nach dem Füllen der jTable läuft eine Routine ab, die überprüft, welche Überweisungen noch getätigt werden muss und welche übnerfällig ist. Dementsprechend wird ein Flag gesetzt. Anhand diesem Flag möchte ich später die anstehenden Überweisungen orange und die überfälligen rot in der jTable färben.

Wie in der API habe ich eine neue Klasse, die vom DefaultTableCellRenderer erbt erstellt.

Der Code sieht so aus:

Java:
public class TableRenderer extends DefaultTableCellRenderer {

    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
       
        return this;
    }
}

Das in der Klasse noch eine Routine implementiert werden muss, das die row abprüft und dementsprechend den Background anders färbt ist mir klar. Habe ich auch schon ausprobiert.

Da liegt auch das Problem. Wenn ich das so implementiere, das die Flags überprüft werden und dementsprechend die Farben gesetzt werden, wird immer nur die letzte Zeile die die in der Routine behandelt wird eingefärbt.

Für mich schaut das so aus, als ob nach jedem Durchlauf die zuvor gesetzte Farbe der Zeile wieder rückgesetzt wird und die nächste eingefärbt wird.

Was mache ich falsch ??

Gibt es auch eine andere Methode um die gesamte Tabelle nach den oben genannten Kriterien farblich zu kennzeichnen?

Vielen Dank Gruß Timo.
 

Ebenius

Top Contributor
Für mich schaut das so aus, als ob nach jedem Durchlauf die zuvor gesetzte Farbe der Zeile wieder rückgesetzt wird und die nächste eingefärbt wird.
Du hast das ja im Prinzip richtig verstanden. Renderer funktionieren immer so, dass für jede Zelle einzeln die getXYZRenderer(…)-Methode aufgerufen wird. Diese richtet eine Komponente ein und gibt sie zurück. Dann wird die Komponente gezeichnet und dann wird mit der nächsten Zelle weiter gemacht. Funktioniert im Prinzip wie stempeln mit so einem typischen Datumsstempel. Die Renderer-Komponente ist dabei der Stempel. Der Renderer setzt in getXYZRenderer(…) das jeweilige Datum des Stempels und färbt ihn ein und so weiter. Die Tabelle drückt dann den Stempel aufs Papier. Dann fragt sie wieder den Renderer für die nächste Zelle, er stellt ein ganz anderes Datum am Stempel ein und nimmt ein anderes Stempelkissen. Die Tabelle stempelt dann wieder den selben Stempel (mit anderem Datum und anderer Farbe).

Aber was jetzt Dein eigentliches Problem ist, kann ich aus Deinem Beitrag nicht erkennen. Wahrscheinlich setzt Du erst den Hintergrund und rufst dann die [c]super[/c]-Implementierung auf die dann die Farbe wieder ändert. Oder etwas in der Art. Mach Doch mal ein einfaches Beispiel für einen Renderer der nicht funktioniert.

Ebenius
 

Timo.

Mitglied
So also in meiner Klasse in der ich den Renderer aufrufe sieht so aus:

Java:
TableRenderer tablerenderer = new TableRenderer();
            tablerenderer.setOffene_auftraege(offene_auftraege);
            manager.jTable_offene_Zahlungen().setDefaultRenderer(Object.class, tablerenderer);

offene_auftraege ins der Vector der alle meinen offenen Aufträge beinhaltet, die auch in der jTable stehen

Die Klasse TableRenderer sieht mittlerweile so aus:

Java:
 public Vector<Kunde> offene_auftraege;
    public int zeilenzaehler;

    public void setOffene_auftraege(Vector<Kunde> offene_auftraege) {
        this.offene_auftraege = offene_auftraege;
    }

    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        for (int i = 0; i < offene_auftraege.size(); i++) {
            for (int j = 0; j < offene_auftraege.get(i).getAuftraege().size(); j++) {

                if (row == zeilenzaehler && (offene_auftraege.get(i).getAuftraege().get(j).getFaellig() == 1 || offene_auftraege.get(i).getAuftraege().get(j).getUeberfaellig() == 2)) {
                    if (row == zeilenzaehler && offene_auftraege.get(i).getAuftraege().get(j).getFaellig() == 1) {
                        setBackground(Color.ORANGE);
                    }
                    if (row == zeilenzaehler && offene_auftraege.get(i).getAuftraege().get(j).getUeberfaellig() == 2) {
                        setBackground(Color.RED);
                    }
                } else {
                    setBackground(Color.WHITE);
                }
                zeilenzaehler++;
                row++;
                setOpaque(true);
            }
        }
        return this;
    }
}

Die Ausgabe in der Tabelle sieht so aus:

Programm.jpg ... at uploaded.to - Free File Hosting, Free Image Hosting, Free Music Hosting, Free Video Hosting, ...

Dabei sollte der erste Eintrag in der Tabelle rot sein, der zweite orange und der dritte normal.

In meinem Fall ist jetzt aber gar nichts markiert.

Habe ich da was an dem Prinzip falsch verstanden?

Was muss ich ändern ? bzw. wo liegt hier der Hund begraben?

Gruß Timo.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
In meinem Fall ist jetzt aber gar nichts markiert.

Habe ich da was an dem Prinzip falsch verstanden?
Ja, hast Du.

Probier's doch erstmal -- zum Verständnis -- mit nem ganz einfachen:
Java:
new DefaultTableCellRenderer() {

    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if(!isSelected) {
            switch(row % 3) {
            case 0:
                setBackground(Color.RED);
                break;
            case 1:
                setBackground(Color.ORANGE);
                break;
            case 2:
                break;
            }
        }
    
    return this;
    }
};
Ein CellRenderer kümmert sich in der getTableCellRenderer(…)-Methode immer nur um eine Zelle, um die die durch [c]row[/c] und [c]column[/c] angegeben ist. For-Schleifen in dieser Methode sind fast immer falsch. :)

Ebenius
 

Timo.

Mitglied
@Ebenius

Danke!!

Mit dem Code von Dir funktioniert es. Ich habe aber auch schon davor etwas Einfacheres versucht das auch funktioniert hat. Wenn du sagst das for Schleifen im Renderer fast immer falsch sind, wo soll dann die Prüfung gemacht werden nach der entschieden wird welche Spalte jetzt rot, orange, oder weiß werden soll?

Gruß Timo.
 

Ebenius

Top Contributor
Ich sag ja nur "fast". Die Schleifen oben verstehe ich nicht ganz, weil ich das Umfeld nicht kenne. Aber spätestens das [c]row++[/c] in Zeile 31 scheint mir ein Indiz für einen Denkfehler zu sein. Denn [c]row[/c] identifiziert ja genau die eine Zeile die der Renderer darstellen soll…

Natürlich braucht man ab und an auch mal ne Schleife in einem Renderer, um irgendwas zu suchen was zur aktuellen Zelle passt. Schuldig. :eek:

Ebenius
 

Timo.

Mitglied
Ja das row++ ist falsch.

Ich habe jetzt mal den kompletten Fall debugt und mir war vorher nicht klar das sich row nicht von selbst inkrementiert.

Ich weiß jetzt auch warum das mit meiner Schleife nicht funktioniert. Und zwar weil bei jedem Schleifendurchgang ja der Teil
Java:
  if (!isSelected) {
            switch (row % 3) {
                case 0:
                    setBackground(Color.RED);
                    break;
                case 1:
                    setBackground(Color.ORANGE);
                    break;
                case 2:
                    break;
            }
        }
Und dieser Teil ja jedes Mal die gesamte Tabelle durchläuft. Deshalb wird mit jedem Schleifendurchlauf die vorher eingefärbten Spalten wieder überschrieben.


Mir ist nur noch nicht so ganz klar wie ich das dann jetzt anders machen soll!

Vielen Dank an Alle Gruß Timo
 

Ebenius

Top Contributor
Um das einschätzen zu können, müsste ich wissen, wie [c]offene_auftraege[/c] in Bezug zu Deinem Tabellenmodell steht.

Ebenius
 

Timo.

Mitglied
in offene_Auftraege sind allen offenen Auftraege, die auch in der Tabelle stehen. Also Objekte der Klasse Auftrag. In der Klasse Auftrag gibt es zwei Flags. Eins falls der Auftrag überfällig ist dann hat das Flag (int ueberfaellig) den Wert 2. Ist der Auftrag fällig, so hat das Flag (int faellig) den Wert 1.

Das muss jetzt überprüft werden. Deshalb die Schleife.

Überfällige Auftäge sollen rot, fällige orange und der Rest ganz normal weiß gekennzeichnet werden.

Gruß Timo.
 

Ebenius

Top Contributor
Du willst also einfach einen Renderer in der Art?
Java:
new DefaultTableCellRenderer() {
 
    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        final Auftrag auftrag = (Auftrag) value;
        if(!isSelected) {
            if (auftrag.getUeberfaellig() == 2) {
                setBackground(Color.RED);
            } else if (auftrag.getFaellig() == 1) {
                setBackground(Color.ORANGE);
            }
        }
    
    return this;
    }
};
Ebenius
 

Ebenius

Top Contributor
Ja im Prinzip schon, nur das die Flags nicht in der Tabelle stehen
Dann willst Du sowas? Ein bisschen mitdenken darfste schon auch noch. ;-)
Java:
new DefaultTableCellRenderer() {
 
    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if (!isSelected) {
            final List<Auftrag> offen = offene_auftraege.get(table.convertRowIndexToModel(row)).getAufträge();
            for (Auftrag auftrag : offen) {
                if (auftrag.getUeberfaellig() == 2) {
                    setBackground(Color.RED);
                } else if (auftrag.getFaellig() == 1) {
                    setBackground(Color.ORANGE);
                }
            }
        }
    
    return this;
    }
};
Ebenius
 

Timo.

Mitglied
Ich bin gerade dabei das so umzustricken dass das mit deinem ersten Vorschlag funktioniert. Bin jetzt auch eigentlich so weit, nur meckert er jetzt .. cannot cast Integer to Auftraege
 

Timo.

Mitglied
So Ebenius


Da es leider nicht klappt bin ich jetzt umgeschwenkt.
Mittlerweile habe ich in die Tabelle zwei Spalten (überfällig und fällig) eingefügt, in denen dann ja oder nein steht.

Jetzt versuche ich dieses abzuprüfen und dementsprechend die Spalten zu färben.

Es scheitert nur daran im Renderer die passende Methode zu finden um aus table den String ja oder nein zu bekommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JTable und farbige Zellen AWT, Swing, JavaFX & SWT 5
V JTable - farbige Boolean-Felder - geht das? AWT, Swing, JavaFX & SWT 3
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben