JTable Zeilen und Zellen einfärben

may24

Bekanntes Mitglied
Hi zusammen,

ich habe folgendes Anliegen.

Ein JTable ist gefüllt mit mehreren Zeilen + Spalten von Daten. Nun möchte ich die angewählte Zeile farblich vom Rest abheben. Zusätzlich soll die angewählte Zelle innerhalb dieser Zeile eine andere Farbe bekommen.
Wird eine neue Zeile (+ Zelle) angeklickt, soll die alte Zeile wieder ihre "Ursprungs-Hintergundfarbe" bekommen.

Hier ist mein custom TableCellRender. Da ich Cell-selection habe funktioniert der im Moment nur bei einer selektierten Zelle und läßt die Zeile unverändert.

Java:
public class MyTableCellRender extends DefaultTableCellRenderer   
{
	private Vector<Integer> lineColors;
	private Color[] segmentColors = new Color[2];
	private int cIdent = 0;
	
	public MyTableCellRender()
	{
		segmentColors[0] = new Color(240,240,240);
		segmentColors[1] = new Color(220,220,220);
		
	}
	
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
    	Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    	
    	if (isSelected) 
    	{
            c.setBackground(new Color(231,243,253));    
            // System.out.println("TableCellRender: " + row);
            
        }
    	else
    	{
    	cIdent = lineColors.get(row);
    	c.setBackground(segmentColors[cIdent]);
    	}
    	
    	return c;
    }
    
    public void updateLineColor(Vector<Integer> lineColorVector)
    {
    	lineColors = lineColorVector;
    }
}
 

may24

Bekanntes Mitglied
Hi, danke für den Link, aber ich habe da nichts passenden/funktionierendes gefunden.
Wie schon erwähnt ist Cell Selection eingeschaltet und da ich hier nitcht mit "value instanceof" arbeiten kann - da die von Fall zu Fall unterschiedlich ist - wird immer nur das "Component" eigefärbt das "selected" ist, und nie die Ganze Zeile.

Man müßte irgentwie an die Components einer kompletten Zeile kommen und deren Background setzen ...
 

Michael...

Top Contributor
Nun möchte ich die angewählte Zeile farblich vom Rest abheben. Zusätzlich soll die angewählte Zelle innerhalb dieser Zeile eine andere Farbe bekommen.
Inwieweit unterscheiden sich Deine Anforderungen vom Standardverhalten der JTable?

Ist die Zelle in der selektierten Zeile ist isSelected==true
Ist die Zelle die selektierte Zelle ist hasFocus==true
 
S

SlaterB

Gast
es ist wichtig zu verstehen, dass es schlicht keine derartigen Components dauerhaft gibt,
die JTable wird einfach gezeichnet, nach und nach wird für jede Zelle eine simple paint-Methode durchlaufen,
danach merkt sich irgendjemand hoffentlich die Pixel, sonst war es umsonst, aber ansonsten ist kein Zustand mehr bekannt,

richtig ist dass der Renderer eine handfeste Komponente wie ein JLabel zurückgibt, bei dem man auch durchaus den Background setzen kann,
aber nur damit in Kürze darin paint() ausgeführt werden kann, ein paar ms später interessiert sich niemand mehr für dieses Label,
außer wenn es in anderer Funktion, z.B. für die nächste Zelle, schon wieder verwendet wird

du kannst dir (vom SelectionListener aus) irgendwo die Information ablegen 'Zeile x = blau'
und im Renderer weißt du durch den Parameter, welche Zeile gerade malt wird und setzt danach den Background
 

may24

Bekanntes Mitglied
@Michael: Wenn du [c]setCellSelectionEnabled(true)[/c] gesetzt hat, kannst du nur Zellen und keine kompletten Zeilen markieren.
Daher funktioniert das [c]hasFocus[/c] nicht so wie ich es brauche. Du kannst zwar mehrere Zellen markieren und die werden dan auch andersfarbig dargestellt, aber nie die komplette Zeile.

Ich befürchte mal es wird tatsächlich nur über einen weiteren ListSelectionListener gehen ...
 

Michael...

Top Contributor
das mit dem setCellSelectionEnabled hatte ich übersehen.

Meinst Du so etwas in der Art?
Java:
import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableCellRenderer;

public class TableTest {

	public static void main(String[] s) {
		new TableTest();
	}

	public TableTest() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JTable table = new JTable(5, 5) {
			public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
				Component comp = super.prepareRenderer(renderer, row, column);
				int selRow = this.getSelectedRow();
				int selCol = this.getSelectedColumn();
				comp.setBackground(this.getBackground());
				if (row==selRow) {
					if (column==selCol)
						comp.setBackground(Color.RED);
					else
						comp.setBackground(Color.BLUE);
				}
				return comp;
			}
		};
		
		table.setCellSelectionEnabled(true);
		table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		

		frame.add(new JScrollPane(table));
		frame.setBounds(0, 0, 200, 200);
		frame.setVisible(true);
	}
}
 

may24

Bekanntes Mitglied
Hi zusammen

Ich hab's immer noch nicht hinbekommen ;(

OK, Ich habe neben meinem TableCellRender der die Zelle farblich markiert nun auch einen ListSelection implementiert der mir die Zeilen einfärben soll. Nur wie ?
Mit
Code:
getSelectedRows()
bekomme ich zwar ein Array mit den entsprechenden Zeilen, doch wie diese mit
Code:
setBackground()
setzen ?
Kann ich durch "table" direkt eine Zeile ansprechen ? Und wenn ja wie ? :autsch:
 
S

SlaterB

Gast
wie gesagt, es gibt den direkten Weg nicht,
- du musst du Information irgendwo auf irgendeine Weise ablegen (* oder auch nicht)
- evtl. das repaint() der fraglichen Zeilen veranlassen
- und dann erst im Renderer (für jede Zelle neu) entweder aus den selber abgelegten Informationen oder (*) aus dem SelectionModel der Tabelle die Informationen holen,
und dann mit allen nötigen Informationen dafür sorgen dass die aktuelle Zelle richtig dargestellt werden
 

may24

Bekanntes Mitglied
Hi zusammen,

ich glaube ich bin dem Ganzen ein Stück näher gekommen.
Ich habe also nun einen Vector der zwei Zahlen speichert. Die Aktuelle Fare un die Original Farbe.
Der ListSelector nimmt das Array der selektierten Zeilen von JTable und übergibt sie meinem TableCellRender der wiederum den Vector mit der Farbinformation abgleicht.
Soweit so gut: Erst mal nach jedem selektieren eine Zeile den Vektor mit den "original Farbwerten" versehen, dann die entsprechend selektierten Zeilen im Vector so abändern das sie auf eine neue Farbe zeigen.
Was jetzt noch fehlt ist ein Event das den TableCellrender dazu veranlasst alles neu zu zeichnen.
[c]repaint()[/c] macht da gar nichts. Ist es nicht eher ein fireTableCellRender... ?

Hier ist der Code für MyTableCellRender:
Java:
...
public class MyTableCellRender extends DefaultTableCellRenderer   
{
	private Vector<int[]> lineColors;
	private Color[] segmentColors = new Color[3];
	private int cIdent = 0;
	
	public MyTableCellRender()
	{
		segmentColors[0] = new Color(240,240,240);
		segmentColors[1] = new Color(220,220,220);
		segmentColors[2] = new Color(192,220,192);
		
	}
	
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {

    	Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    	
    	if (isSelected) 
    	{
            c.setBackground(new Color(231,243,253));
        }
    	else
    	{
    		int[] tmpArray = lineColors.get(row);
    		cIdent = tmpArray[0];
    		c.setBackground(segmentColors[cIdent]);
    	}
    	return c;
    }
    
    public void updateLineColorVector(Vector<int[]> lineColorVector)
    {
    	lineColors = lineColorVector;
    }
    
	public void updateLinesFromListSelector(int[] selectedLines)
    {
    	// first: cleanup
    	int rounds = lineColors.size();
    	for ( int i = 0; i< rounds; i++)
    	{
    		int[] tmpLine = lineColors.get(i);
    		tmpLine[0] = tmpLine[1];
    		System.out.println(tmpLine[0]);
    		lineColors.set(i, tmpLine);
    	}
    	
    	// modify the selected lines
    	rounds = selectedLines.length;
    	for ( int i = 0; i< rounds; i++)
    	{
    		int affectedLine = selectedLines[i];
    		int[] tmpLine = lineColors.get(affectedLine);
    		int[] newLine = new int[] { 2, tmpLine[1]};
    		lineColors.set(affectedLine, newLine);
    	}

    	//repaint ??
    }
}
 
S

SlaterB

Gast
genau, fire() in TableModel, welche es da gibt für evtl. zeilengenaues Update kann man nachschlagen,
im Zweifel ist fireTableDataChanged() immer relativ gut
 

may24

Bekanntes Mitglied
Ah ... ein einfaches [c]table.repaint()[/c] langt eigentlich schon.
Obwohl das Ganze ziemlich langsam ist ... Aber ich befürchte mal das liegt in der Natur der Sache.
Sprich wenn man die Farbinformation in einem Vector speicert und so benutzt wie ich das tue dauert's halt mit dem repaint ...

Auch wenn ich die Methode in mein DataModel "auslagere" wird's nicht schnelle. Und je mehr Zeilen/Zellen dazukommen desto langsamer wirds logischerweise.

Oder hat jemand noch 'ne Idee ?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
M Selektierte Zeilen von JTable AWT, Swing, JavaFX & SWT 10
M JTable Zeilen einfärben AWT, Swing, JavaFX & SWT 13
S Swing JTable Zeilen löschen AWT, Swing, JavaFX & SWT 21
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
B JTable Zeilen und Spalten selektieren AWT, Swing, JavaFX & SWT 5
kniffel Ausgabe von leeren JTable Zeilen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
0 JTable leere Zeilen einfügen AWT, Swing, JavaFX & SWT 3
D JTable mit mehrzeiligen Zeilen AWT, Swing, JavaFX & SWT 5
kodela Swing selektierte Zeilen in JTable AWT, Swing, JavaFX & SWT 3
D Swing JTable: über sichtbare Zeilen iterieren AWT, Swing, JavaFX & SWT 2
U JTable: Zeilen abhängig vom Datensatz einfärben AWT, Swing, JavaFX & SWT 4
A JComboBox-Zeilen in JTable AWT, Swing, JavaFX & SWT 2
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
B Swing JTable: mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 3
M JTable - mehrere Zeilen selektieren AWT, Swing, JavaFX & SWT 7
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
A Swing JTable Zeilen einfügen verbieten AWT, Swing, JavaFX & SWT 3
elitebiber Swing Zeilen in einer JTable gruppieren AWT, Swing, JavaFX & SWT 3
O Zeilen in JTable auf Grund eines Wertes einfärben AWT, Swing, JavaFX & SWT 6
R Suchbare Zeilen von JTable in JScrollPane ermitteln AWT, Swing, JavaFX & SWT 9
O JTable Zeilen "nach oben" verschieben AWT, Swing, JavaFX & SWT 3
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
A Multiple Zeilen in einer JTable Zelle AWT, Swing, JavaFX & SWT 6
F Per KeyListener Zeilen aus JTable löschen AWT, Swing, JavaFX & SWT 9
M JScrollbar + JTable + Zeilen wie in Excel hinzufügen AWT, Swing, JavaFX & SWT 14
S JTable zwei Text-Zeilen in einer Zelle AWT, Swing, JavaFX & SWT 2
Z JTable Zeilen nummerieren AWT, Swing, JavaFX & SWT 2
G JTable mit JTextAreaEditor - Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 4
S Welcher Listener ? In JTable mehrere Zeilen markieren & AWT, Swing, JavaFX & SWT 2
J JTable - Wie Zeilen löschen ? AWT, Swing, JavaFX & SWT 8
A Attribute von Objekten in JTable-Zeilen anzeigen AWT, Swing, JavaFX & SWT 2
E JTable; Zeilen der ersten Spalte definieren? AWT, Swing, JavaFX & SWT 4
A JTable, bestimmte Zeilen blau hinterlegen AWT, Swing, JavaFX & SWT 3
S JTable Makierungen über mehrere Zeilen nicht akzeptieren AWT, Swing, JavaFX & SWT 5
M JTable. Beim löschen der Zeilen Fehlermeldung AWT, Swing, JavaFX & SWT 22
S JTable, mehrere Spalten/Zeilen zeitlich versetzt hinzufügen AWT, Swing, JavaFX & SWT 6
G JTable zur Laufzeit Spalten und Zeilen hinzufügen AWT, Swing, JavaFX & SWT 7
B JTable - Zeilen nachträglich hinzufügen? AWT, Swing, JavaFX & SWT 3
javasdann JTable sichtbare Zeilen innerhalb von JScrollPane ermitteln AWT, Swing, JavaFX & SWT 5
S Im JTable Zeilen ein-/ausblenden AWT, Swing, JavaFX & SWT 6
J Markierte Zeilen in einem JTable AWT, Swing, JavaFX & SWT 3
J JTable-Zeilen mit Werten füllen AWT, Swing, JavaFX & SWT 7
Student JTable - Zeilen und Spalten vertauschen AWT, Swing, JavaFX & SWT 4
W JTable: Zeilen nicht editierbar setzen AWT, Swing, JavaFX & SWT 6
L JTable -> Zeilen hinzufügen AWT, Swing, JavaFX & SWT 9
M JTable - unterschiedliche Hintergrundfarben von Zeilen AWT, Swing, JavaFX & SWT 2
S Zeilen einer JTable verstecken AWT, Swing, JavaFX & SWT 2
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
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

Ähnliche Java Themen

Neue Themen


Oben