Swing TableCellRenderer

C

Camino

Gast
Hallo,

ich hab ein kleines Problem. Ich möchte in meiner Swing-Anwendung in einer JTable Zellen bzw. Werte in Zellen farbig einfärben. Zum Teil klappt das mit dem TableCellRenderer auch schon ganz gut. Nun hab ich aber in Zellen Werte (zusammengesetzte Strings) mit folgender Struktur: z.B. "1/5", also zwei Zahlen getrennt durch einen Schrägstrich. Anstatt der Zahlen können aber auch Fragezeichen stehen, z.B. "?/4" oder "7/?" oder auch "?/?". Die normale Schriftfarbe ist schwarz. Ich wollte jetzt die Fragezeichen mit der Farbe grau versehen. Die Zahlen sollen aber weiterhin in schwarz angezeigt werden.

Bei Zellen mit nur einem Fragezeichen drin hab ich das bisher so gemacht:
Java:
if ( column == 5 && (table.getValueAt(row, 5).equals("?")))
				setForeground( Color.GRAY );

Wie mache ich das aber nun mit dem zusammensetzten String, bei denen nur die Fragezeichen grau werden sollen?

Grüsse
Camino
 

Marco13

Top Contributor
Mir würden da jetzt nur frickelige Lösungen einfallen, aber die am wenigsten frickelige, wenn man von DefaultCellRenderer erbt, wäre IMHO, HTML zu verwenden: Den String in drei Teile aufteilen
vorDemStrich / nachDemStrich
dann schauen, ob eins davon das Fragezeichen ist, und dann sowas machen wie
Code:
setText("<html><font color=#FF0000>"+vorDemStrich+"</color>"+"/"+nachDemStrich+"</html>");
um z.B. den Teil vorDemStrich rot zu machen...
 
C

Camino

Gast
Hallo,

das mit dem HTML wäre vielleicht prima. Werde ich gleich mal testen. Ich muss den String auch nur in 2 Teile aufteilen (Trennzeichen ist der Schrägstrich), dann habe ich vorne und hinten und kann überprüfen, ob da ein Fragezeichen drinsteht. Danke für den Tipp. Ich melde mich, wenn es geklappt hat, oder falls es weitere Fragen gibt.

Gruss
Camino
 
C

Camino

Gast
Hmm, schade. Klappt irgendwie nicht.

Hab das HTML nochmal korrigiert/angepasst:
Java:
for (int z = 6; z <13; z++) {

String temp_value = (String) table.getValueAt(row, z);
String[] temp = temp_value.split( Pattern.quote( " / " ) );

if ( column == z)
setText("<html><font color=#FF0000>"+temp[0]+"</font>"+"/<font color=#FF0000>"+temp[1]+"</font></html>");

}

temp ist der Array, welcher mir den String mit dem Trennzeichen "/" zerlegt hat. Das war jetzt unabhängig von den Fragezeichen, einfach mal um die Farbzuweisung zu testen. Aber die Schriftfarbe ist weiterhin schwarz. Vielleicht ist "setText" nicht der richtige Befehl?
 

Marco13

Top Contributor
EDIT: Äh ... halt... Wo rufst du das denn überhaupt auf? ???:L Mit der for-Schleife da ???:L (Sorry, bin müde...)



Hm.. hab' gerade mal auf die Schnelle zum Testen in der Using Swing Components: Examples (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components) in der Methoden "setUpSportColumn" den Renderer so erweitert...
Java:
        DefaultTableCellRenderer renderer =
                new DefaultTableCellRenderer()
        {
            public Component getTableCellRendererComponent(
                            JTable table, Object color,
                            boolean isSelected, boolean hasFocus,
                            int row, int column)
            {
                Component c = super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
                String red = "red";
                String green = "green";
                setText("<html><font color=#FF0000>"+red+"</font>"+"/<font color=#00FF00>"+green+"</font></html>");
                return this;
            }

        };
Und er zeigt den Text in rot und grün an ... Poste ggf. mal ein KSKB... Erbst du auch von DefaultTableCellRenderer?
 
C

Camino

Gast
Hmm, kann leider auf die Schnelle kein KSKB liefern. Ich hab mir eine eigene Klasse geschrieben (ColoredTableCellRenderer), die den TableCellRenderer implementiert. In dieser Klasse gibt es dann diese Methode:
Java:
public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
Dort befindet sich dann auch die vorher genannte for-Schleife, die für die Spalten 6-12 die farbliche Änderung bewirken soll.

Dieser Renderer wird in der Klasse mit der JTable gesetzt:
Java:
setDefaultRenderer(Object.class, new ColoredTableCellRenderer(tableModel));

Na ja, ehrlich gesagt, blicke ich da gerade selber nicht mehr durch und muss das wohl erst mal wieder sortieren. Ich hatte das als Beispiel irgendwo im Netz gefunden und dann nach und nach erweitert. Vielleicht ist da nun zu viel Zeugs drin und ich muss erst mal ausmisten.

Ich melde mich wieder...

Danke und viele Grüsse
Camino
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Also, wenn das wirklich IN der überschriebenen get...Component-Methode vom FefaultTableCellRenderer steht, sollte es eigentlich mit sowas wie
Code:
super.get...Component(...alle Parameter...);
String temp_value = (String) table.getValueAt(row, column);
String[] temp = temp_value.split( Pattern.quote( " / " ) );
setText("<html><font color=#FF0000>"+temp[0]+"</font>"+"/<font color=#FF0000>"+temp[1]+"</font></html>");
return this;
gehen - ohne for-schleife...
 
C

Camino

Gast
Hallo,

es lag wohl daran, dass ich in meiner Klasse ColoredTableCellRenderer mittlerweile schon so viele Zellformatierungen eingetragen hatte, die meistens auch von irgendwelchen Bedingungen abhängig waren, dass ich etwas den Überblick verloren hatte. Ich hatte das nun nochmal mit einer neuen Klasse versucht und da nur den von dir genannten Code reingeschrieben. Das hat tatsächlich so geklappt. Vielleicht hatte ich in dem Wust an hinzugefügten Zellformatierungen wieder etwas überschrieben oder die Reihenfolge nicht beachtet.

Noch etwas zu der von mir verwendeten for-Schleife. Damit wollte ich die Zellenformatierung nur für bestimmte Spalten erreichen, und nicht für alle. Also, in diesem Fall nur für die Spalten 6-12. Na ja, egal ob ich
Java:
for (int z = 6; z <13; z++) {
...
if ( column == z)
				setText...
}
schreibe, oder
Java:
if ( column >= 6 && column <= 12) {
				setText...
}
es klappt beides.

Jetzt hätte ich nur noch eine Verständnisfrage: Wo ist der Unterschied bzw. was ist besser? Einmal habe ich eine Klasse abgeleitet von DefaultTableCellRenderer, und einmal eine Klasse abgeleitet von JLabel, die einen TableCellRenderer implementiert. Beides scheint OK zu funktionieren.

Danke für die Hilfe.

Viele Grüsse
Camino
 
H

hurz12klllhlhlh

Gast
Einmal habe ich eine Klasse abgeleitet von DefaultTableCellRenderer, und einmal eine Klasse abgeleitet von JLabel, die einen TableCellRenderer implementiert. Beides scheint OK zu funktionieren.
Wenn man sich, um das setzen der Selektion und Focus nicht kümmern will bzw. die default Einstellungen verwenden will ist es geschickter von DefaultTableCellRenderer (der selbst auch von JLabel erbt) zu erben.

Das mit der for Schleife ist eigentlich Quatsch, Du willst ja nur etwas ausführen, wenn der Spaltenindex innerhalb eines bestimmten Bereichs liegt --> also nur einmal die if Abfrage mit den zwei Bedingungen.

Man kann auch einzelnen Spalten explizit einen Renderer zuweisen, dann kannst Du Dir den Spaltenvergleich im Renderer selbst sparen. Das wäre m.M. die beste Variante.
 
C

Camino

Gast
Wenn man sich, um das setzen der Selektion und Focus nicht kümmern will bzw. die default Einstellungen verwenden will ist es geschickter von DefaultTableCellRenderer (der selbst auch von JLabel erbt) zu erben.
OK, werde ich dann wohl so machen.

Das mit der for Schleife ist eigentlich Quatsch, Du willst ja nur etwas ausführen, wenn der Spaltenindex innerhalb eines bestimmten Bereichs liegt --> also nur einmal die if Abfrage mit den zwei Bedingungen.
Ja, stimmt. Ist eine kürzere und übersichtlichere Schreibweise. Werde ich aber wohl eh bald weglassen können, weil:

Man kann auch einzelnen Spalten explizit einen Renderer zuweisen, dann kannst Du Dir den Spaltenvergleich im Renderer selbst sparen. Das wäre m.M. die beste Variante.
Das hört sich sogar noch besser an, weil ich nämlich in meiner Swing-Anwendung ein JTabbedPane mit jeweils einer Tabelle pro Tab habe, die teilweise gleiche Spalten haben. So könnte ich für diese Spalten einen Renderer schreiben und müsste das nicht für jede Tabelle wiederholen.

Danke für die Tipps...

Viele Grüsse
Camino
 
C

Camino

Gast
OK, es klappt nun so, wie ich möchte. Es werden nur die Fragezeichen grau gefärbt. Ich hab jetzt auch nur für die gewünschten Spalten einen Renderer erstellt und diesen der Tabelle über das ColumnModel zugewiesen. Das werde ich nun auch für die anderen Tabellen in dem JTabbedPane so umsetzen.

Hier nochmal der relevante Code in meiner Renderer-Klasse:
Java:
String colorGrey = "9A9A9A";
String color1 = "000000";
String color2 = "000000";

String temp_value = (String) table.getValueAt(row, column);
String[] temp = temp_value.split( Pattern.quote( " / " ) );
		
if (temp[0].equals("?")) color1 = colorGrey;
	else color1 = "000000";
if (temp[1].equals("?")) color2 = colorGrey;
	else color2 = "000000";
		
setHorizontalAlignment(CENTER);
setText("<html><font color=#" + color1 + ">" + temp[0] + "</font> " +
		"<font color=#" + colorGrey + "> / </font> " +
		"<font color=#"	+ color2 + ">" + temp[1] + "</font></html>");

Vielen Dank für Eure Hilfe
Camino
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B TableCellRenderer rendert Integer/Boolean Felder nicht AWT, Swing, JavaFX & SWT 4
M Swing TableCellRenderer elegant anpassen AWT, Swing, JavaFX & SWT 3
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
C Swing TableCellRenderer: setText() vs. setIcon() AWT, Swing, JavaFX & SWT 5
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
M gleicher TableCellRenderer für mehrere unterschiedliche Tabellen AWT, Swing, JavaFX & SWT 5
A Swing TableCellRenderer ändert die Zeilenfarbe zu spät AWT, Swing, JavaFX & SWT 3
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
J NullPointerException bei Benutzung vom TableCellRenderer AWT, Swing, JavaFX & SWT 3
U TableCellRenderer: Problem mit Timestamp/Date AWT, Swing, JavaFX & SWT 2
U TableCellRenderer UND prepareRenderer AWT, Swing, JavaFX & SWT 12
U TableCellRenderer und setBackground AWT, Swing, JavaFX & SWT 20
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
C Swing Problem mit TableCellRenderer in Verbindung mit TableRowSorter AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 3
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
S TableCellRenderer: JLabel-Background in JPanel AWT, Swing, JavaFX & SWT 7
R JTable mit TableCellRenderer AWT, Swing, JavaFX & SWT 10
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 2
D TableCellRenderer rendert einfach nicht! AWT, Swing, JavaFX & SWT 4
S TableCellRenderer setForeground AWT, Swing, JavaFX & SWT 5
I Problem mit TableCellRenderer AWT, Swing, JavaFX & SWT 3
K TableCellRenderer Problem AWT, Swing, JavaFX & SWT 3
F TableCellRenderer wie umsetzen? AWT, Swing, JavaFX & SWT 2
D JTable TableCellRenderer AWT, Swing, JavaFX & SWT 2
J JTable und TableCellRenderer AWT, Swing, JavaFX & SWT 2
G TableCellRenderer Background variiert darstellen AWT, Swing, JavaFX & SWT 3
P TableCellRenderer mit einem TableRowSorter AWT, Swing, JavaFX & SWT 4
D TableCellRenderer PRoblem AWT, Swing, JavaFX & SWT 3
G TableCellRenderer soll ganze ausgewählte Zeile markieren AWT, Swing, JavaFX & SWT 2
S TableCellRenderer deaktivieren AWT, Swing, JavaFX & SWT 13
J TableCellRenderer AWT, Swing, JavaFX & SWT 5
S JTree mal anders (TableCellRenderer) AWT, Swing, JavaFX & SWT 6
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
M Objekt in TableCellRenderer packen, warum ein Fehler? AWT, Swing, JavaFX & SWT 2
T TableCellRenderer Problem AWT, Swing, JavaFX & SWT 6
B TableCellRenderer + JComboBoxen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben