Hallo und danke für's Lesen vorweg!
Ich habe hier Quelltext, dessen Autor ein Bekannter von mir ist. Eine darin enthaltene Tabelle hat 11 Spalten. In der letzten Spalte sollen die Zellen abhängig von ihrem Wert eingefärbt werden. In der Spalte stehen Integer-Werte. Ist ein Wert größer als 0, soll die Zelle rot markiert werden. Dazu habe ich den CellRenderer der entsprechenden Spalte auf diesen gesetzt:
Die Bedingung im isSelected-Block greift so, wie ich mir das vorgestellt habe. Allerdings nur in den selektierten Zeilen. Im else-Teil, also betreffs aller anderen (nicht selektierten) Zeilen, greift meine Bedingung nie - obwohl im Ergebnis so ganz allgemein schon die "Farben stimmen". Nur der (Sonder-)Fall, den ich hier behandeln will (value > 0 bei nicht-selektierten), wird nicht erkannt.
Ich habe versucht nachzuvollziehen, wann getTableCellRendererComponent aufgerufen wird. Scheinbar im Zuge etlicher Ereignisse, wie dem Selektieren (daher klappt der erste Teil auch) oder bei Änderung der Mausposition etc. Ich hätte erwartet, dass die Tabelle irgendwo initial gezeichnet wird und dann alle Zellen einmal durchgegangen werden. Es scheint dem nicht so zu sein und dieser Renderer verhält sich anders, als ich dachte.
Ich habe die ein oder andere Beschreibung und ein gefühltes Dutzend Forumsthemen gelesen. Es heißt oft, der Renderer sei eben nur eine Instanz (für die ganze Spalte) und man müsse ihn sich wie einen Stempel vorstellen. Diese Tatsache scheint irgendwie mit meinem Vorhaben zu kollidieren.
Ich erwarte absolut keinen fertigen Code, ein guter Denkanstoß bzw. ein guter Link, wo ich die Antwort nachschlagen kann wäre schon klasse. Von selbst kam ich leider bisher nicht auf des Rätsels Lösung.
Danke!
Ich habe hier Quelltext, dessen Autor ein Bekannter von mir ist. Eine darin enthaltene Tabelle hat 11 Spalten. In der letzten Spalte sollen die Zellen abhängig von ihrem Wert eingefärbt werden. In der Spalte stehen Integer-Werte. Ist ein Wert größer als 0, soll die Zelle rot markiert werden. Dazu habe ich den CellRenderer der entsprechenden Spalte auf diesen gesetzt:
Java:
class ColorRendererMinimumStock extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column){
setHorizontalAlignment(JLabel.RIGHT);
setText((value == null) ? "" : value.toString());
setFont(getFont().deriveFont(Font.PLAIN));
if(isSelected){
setOpaque(true);
setBackground(UIManager.getColor("Table.selectionBackground"));
setForeground(UIManager.getColor("Table.selectionForeground"));
if(value == null) {
} else if(value instanceof Integer) {
Integer val = ((Integer)value).intValue();
if(val > 0){
setBackground(Color.RED);
setForeground(Color.WHITE);
}
}
} else {
setOpaque(false);
setBackground(null);
setForeground(Color.BLACK);
if(value == null) {
} else if(value instanceof Integer) {
Integer val = ((Integer)value).intValue();
if(val > 0){
setBackground(Color.RED);
setForeground(Color.WHITE);
}
}
}
return this;
}
}
Die Bedingung im isSelected-Block greift so, wie ich mir das vorgestellt habe. Allerdings nur in den selektierten Zeilen. Im else-Teil, also betreffs aller anderen (nicht selektierten) Zeilen, greift meine Bedingung nie - obwohl im Ergebnis so ganz allgemein schon die "Farben stimmen". Nur der (Sonder-)Fall, den ich hier behandeln will (value > 0 bei nicht-selektierten), wird nicht erkannt.
Ich habe versucht nachzuvollziehen, wann getTableCellRendererComponent aufgerufen wird. Scheinbar im Zuge etlicher Ereignisse, wie dem Selektieren (daher klappt der erste Teil auch) oder bei Änderung der Mausposition etc. Ich hätte erwartet, dass die Tabelle irgendwo initial gezeichnet wird und dann alle Zellen einmal durchgegangen werden. Es scheint dem nicht so zu sein und dieser Renderer verhält sich anders, als ich dachte.
Ich habe die ein oder andere Beschreibung und ein gefühltes Dutzend Forumsthemen gelesen. Es heißt oft, der Renderer sei eben nur eine Instanz (für die ganze Spalte) und man müsse ihn sich wie einen Stempel vorstellen. Diese Tatsache scheint irgendwie mit meinem Vorhaben zu kollidieren.
Ich erwarte absolut keinen fertigen Code, ein guter Denkanstoß bzw. ein guter Link, wo ich die Antwort nachschlagen kann wäre schon klasse. Von selbst kam ich leider bisher nicht auf des Rätsels Lösung.
Danke!
Zuletzt bearbeitet: