Swing JTable - Zeilen färben (mit Model)

ObiKenobi

Mitglied
Hallo,

folgendes Problem oder gegebenheit.

Ich würde ganz gerne einzelne Spalten (die die unterschiede in den Daten aufweisen) farblich hervorheben.

Bin mir nur nicht ganz sicher wie ich das mache wenn ich die Tabelle mit "model" zeichne.

Ich generiere die Tabelle folgendermaßen.

Java:
	private String[] titles = new String[] { "", "Database A", "Database B" };
	final DefaultTableModel model = new DefaultTableModel(titles, 0);
	private JTable table = new JTable(model);

Die daten kommen folgendermaßen in die JTable

Java:
							// model.addRow(new Object[] { "Schema", "", "" });
					model.addRow(new Object[] { "Tablename", columnData.tableName, columnData.tableName });
					model.addRow(new Object[] { "Columnname", columnData.columnName, columnData.columnName });
					model.addRow(new Object[] { "Type", columnData.columnTypeA, columnData.columnTypeB });
					model.addRow(new Object[] { "Size", columnData.columnSizeA, columnData.columnSizeB });
					model.addRow(new Object[] { "Auto Increment", columnData.isAutoIncrementA, columnData.isAutoIncrementB });
					model.addRow(new Object[] { "Case Sensitive", columnData.isCaseSensitive, columnData.isCaseSensitiveB });
					model.addRow(new Object[] { "Currency", columnData.isCurrencyA, columnData.isCurrencyB });
					model.addRow(new Object[] { "Writable", columnData.isWritableA, columnData.isWritableB });
					// model.addRow(new Object[] { "Def. Writable", columnData.isDefinitelyWritableA, columnData.isDefinitelyWritableB });
					// model.addRow(new Object[] { "Nullable", columnData.isNullableA, columnData.isNullableB });
					model.addRow(new Object[] { "Read Only", columnData.isReadOnlyA, columnData.isReadOnlyB });
					model.addRow(new Object[] { "Searchable", columnData.isSearchableA, columnData.isSearchableB });
					model.addRow(new Object[] { "Signed", columnData.isSignedA, columnData.isSignedB });

Für jeder der Variablen habe ich noch ein boolean im OBjekt (z.B. isSignedEqual).
Nun würde ich gerne für den Fall das z.B. "isSignedEqual" false is die dementsprechende Spalte farbig machen.

Wie ich das mache ist mir schon klar (von wegen JTree-Renderer überschreiben) ich hab nur absolut keine Idee wie ich dem die Variable ob sie nun gleich sind (oder nicht) übergeben soll...

Könntet ihr mir dabei helfen? Dafür wäre ich euch sehr dankbar.

Grüße,
Obi
 
S

SlaterB

Gast
dem Renderer kann man nichts übergeben, außer der Klasse an sich die ganze Tabelle/ das Model usw.,

der Renderer bekommt beim automatischen Ablauf in der render-Methode Zeile + Spalte und kann anhand dieser Informationen
im Model oder sonstwo Informationen abfragen und dann Farbe setzen usw.
 

bERt0r

Top Contributor
Es wäre möglich z.B im Model die Daten in bestimmte Objekte zu packen, die Eigenschaften wie Farbe beinhalten. Auf diese müsstest du dann im Renderer casten und dann eben die Farbe einstellen.

z.B:
Java:
class MyTableCellValue
{
Color bgColor,textColor;
Object value;
}
 
S

SlaterB

Gast
@ObiKenobi
ich kann deine Aussagen nicht nachvollziehen, insofern vermute ich, dass du auf mein bezogen nicht richtig verstehst, nein

von Spalten generieren habe ich nicht gesprochen,
'direkt danach' klingt irgendwie komisch, mit 'quasi' noch mehr,

was jetzt speziell mit der letzen Zeile passiert kann ich nicht beurteilen,
mag sein dass du vorher irgendwann ja Farben zugewiesen hast, ja, wobei 'bunt' eine komische Farbe ist,
mit dem Render-Prozess scheint mir das wenig zu tun zu haben, jedenfalls ist dort jede Zeile/ Spalte gleich,
eine letzte fällt nicht direkt als solche auf

vielleicht erzählst du auch richtiges zu deinem Programm, ich sehe aber nicht durch,
wie ein Renderer aufgebaut ist dürfte aus den Beispielen klar sein
 

ObiKenobi

Mitglied
Hallo,

vielen Dank für die Zahlreichen tipps.

Ich bin jetzt zu dem schluss gekommen das ich die Farbinformationen ganz gern im Vektor bzw. im Model speichern würde und dann über den Renderer aufrufen würde.

Da sich die Farbinformationen nur pro Zeile und nicht pro spalte ändern würden, ist es irgendwie möglich die Farbinformationen nur EINMAL für die ganze Zeile zu speichern oder muss ich für jede spalte ein extra Objekt anlegen das die Farbinformationen enhtält?

Und wenn ja, wie?

Grüße,
Obi
 
S

SlaterB

Gast
wie würdest du es denn pro Spalte (und anscheinend auch pro Zeile) machen?
wenn du das kannst, dann mache das erstmal, dann wäre es danach relativ leicht zu ändern,

du hast für jedes einzelnde Rendern den Zeilen- und den Spalten-Index,
selbstverständlich kannst du auch auf Daten zugreifen nur mit dem Zeilen-Index, wenn die Daten entsprechend aufgebaut sind,

grundsätzlich ist das nicht viel anders, irgendwo im Model, bei deinen normalen Daten oder in separaten Variablen/ Arrays/ Listen/ Maps, was auch immer, musst du die Daten ablegen und darauf zugreifen,
die normalste Sache der Welt

wenn du 50 Zeilen hast und ein Array mit 50 Feldern für die 50 Farben anlegst, dann kannst du sowieso nicht mehr machen
als mit Zeilenindes 0, 17 oder 49 drauf zugreifen, du kämst gar nicht in die Verlegenheit den Spaltenindex noch zu nutzen

bei 50 Zeilen und 7 Spalten aber ein 50x7 Array anzulegen, in jeder Zeile 7x dieselbe Farbe abzulegen
und später per Spaltenindex unter den jeweils 7 gleichen Farben auszuwählen, das erscheint nicht so schlau
 

ObiKenobi

Mitglied
Ich bin noch nicht so ganz sicher mit der Java-Materie. Deshalb sind meine Ideen meist nur Theoretisch.

Meine Idee war, ein eigenes Model anzulegen (nennen wirs mal MyModel :bahnhof:)

Und in das MyModel die Daten folgendermaßen abzulegen :

IsDifferent (true / false - heißt Farblich hervorheben)
und
Vector ( { Spalte 1 , Spalte 2 , Spalte 3, ... } )

lässt sich das so pauschal machen?

Bin gerade schon wie wild am googlen wie ich ein eigenes "Model" anleg, aber so das der auch immer noch meine "Titles" übernimmt.

EDIT :

Okay, mein eigenes MOdel hab ich jetzt schonmal,

jetzt muss ich nurnoch die Farbkennung reinbekommen :D
 
Zuletzt bearbeitet:

ObiKenobi

Mitglied
OKay Hi,

ich schon wieder,

aktueller stand :


Java:
		public class MyTableModel extends DefaultTableModel {
	
		public MyTableModel(String[] titles, int i) {
			super(titles, i);
		}

		public void addRow(boolean isEqual, Object[] rowData) {
			
		}



		public boolean isCellEditable(int rowIndex, int columnIndex) {
			return false;
		}

	}

	public class MyTableCellRenderer extends DefaultTableCellRenderer {

		public Component getTableCellRendererComponent(JTable table, Object value,boolean isEqual, boolean isSelected, boolean hasFocus, int row, int column) {
			Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

				comp.setBackground(Color.WHITE);
				comp.setForeground(Color.BLACK);
			

			return this;
		}

	}


jetzt müsste ich nurnoch die Boolean Variable aus dem Model in den Renderer kriegen...

weiß gerade aber absolut nicht wie...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
welche boolean-Variable? die isCellEditable()-Methode?
du hast die JTable als Parameter, dort kannst du das Model abfragen, gegebenenfalls auf deine Klasse casten,
aber isCellEditable() gibt schon das Interface TableModel vor, diese Methode kann im Model aufgerufen werden
 

ObiKenobi

Mitglied
Heyho, ich schreite vorran...


Ich übergebe beim "model-Objekt"

folgendes

Java:
				model.addRow(false, new Object[] { "Tablename", columnData.tableName, columnData.tableName });
					model.addRow(true, new Object[] { "Columnname", columnData.columnName, columnData.columnName });
					model.addRow(false, new Object[] { "Type", columnData.columnTypeA, columnData.columnTypeB });

wobei false dafür steht das die Spalte farbig sein soll und true dafür das sie "einheitlich" sein soll.

Mein "eigenes" Modell sieht jetzt folgendermaßen aus :

Java:
	public class MyTableModel extends DefaultTableModel {
		private static final long serialVersionUID = 1L;
		private boolean colored;

		public MyTableModel(String[] titles, int i) {
			super(titles, i);
		}

		public void addRow(boolean isEqual, Object[] objects) {
			// TODO Auto-generated method stub
			addRow(objects);
			colored = !isEqual;
		}

		public boolean isCellEditable(int rowIndex, int columnIndex) {
			return false;
		}

		public boolean isColored() {
			return colored;
		}

	}

Und mien TableCellRenderer so :
Java:
	public class MyTableCellRenderer extends DefaultTableCellRenderer {
		private static final long serialVersionUID = 1L;

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
			Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

			System.out.println(model.isColored() + " and " + value);
			
			if (model.isColored()) {
				comp.setBackground(Color.RED);
				comp.setForeground(Color.WHITE);
			} else {
				comp.setBackground(Color.WHITE);
				comp.setForeground(Color.BLACK);
			}

			return this;
		}

	}

Leider bekommt der Table Cell renderer aber irgendwie immer den selben Boolean obwohl ich verschiedene übergeb. Kann mir gerade nicht so erklären warum.
 
S

SlaterB

Gast
colored ist ein einzelnes Feld/ Attribut im Model, selbst wenn sich das bei mehreren addRow()-Aufrufen ändert wird maximal der letzte Wert gespeichert,
wie kann so eine grundlegende Tatsache, nicht nur von Programmierung sondern von der Welt allgemein, unverständlich sein?

wenn du auf eine Wand immer wieder Aufkleber übereinander klebst, ist am Ende nur der letzte zu sehen..

du brauchst eine Liste, Array oder sonst eine Datenstruktur für mehrere Werte, wie schon gesagt,
auch habe ich gesagt bzw. ist komplett selbstverständlich, dass du den Zeilenindex irgendwie nutzen musst,
wie soll ein Aufruf model.isColored() für Zeile 7 was anderes zurükgeben als für Zeile 8?
dass der Index mit übergeben werden muss ist doch so sonnenklar..,
oder soll ein Bankautomat den richtigen Kontostand anzeigen ohne dass man eine Karte hineinsteckt?
grundlegendste Grundlagen der gesamten Logik überhaupt..
 

ObiKenobi

Mitglied
colored ist ein einzelnes Feld/ Attribut im Model, selbst wenn sich das bei mehreren addRow()-Aufrufen ändert wird maximal der letzte Wert gespeichert,
wie kann so eine grundlegende Tatsache, nicht nur von Programmierung sondern von der Welt allgemein, unverständlich sein?

wenn du auf eine Wand immer wieder Aufkleber übereinander klebst, ist am Ende nur der letzte zu sehen..

du brauchst eine Liste, Array oder sonst eine Datenstruktur für mehrere Werte, wie schon gesagt,
auch habe ich gesagt bzw. ist komplett selbstverständlich, dass du den Zeilenindex irgendwie nutzen musst,
wie soll ein Aufruf model.isColored() für Zeile 7 was anderes zurükgeben als für Zeile 8?
dass der Index mit übergeben werden muss ist doch so sonnenklar..,
oder soll ein Bankautomat den richtigen Kontostand anzeigen ohne dass man eine Karte hineinsteckt?
grundlegendste Grundlagen der gesamten Logik überhaupt..

Naja ich bin davon ausgegangen das er die Zeile Zeichnet und dann zum nächsten AddRow springt. Wenn das so ist ist das problem ja echt nur Trivial :D

Danke!
 
S

SlaterB

Gast
der Renderer kommt erst viel später dran und auch diverse Male, je nachdem wann wie oft gezeichnet werden muss,
mit dem seltenen Zusammenstellen der Daten ist das nicht verknüpft
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
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
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
M JTable Zeilen und Zellen einfärben AWT, Swing, JavaFX & SWT 11
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
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