Spalte der Tabelle abwechselnd färben

Iron Monkey

Bekanntes Mitglied
Hi!

Die sortierte Spalte der Tabelle soll wie folgt abwechselnd gefärbt werden:

1|
2|-- grün färben, da zwischen 3 und 5 die 4 fehlt!
3|
--
5|
6|-- weiss färben, da zwischen 7 und 25 die Zahlen fehlen!
7|
--
25|-- grün färben, da zwischen 26 und 35 die Zahlen fehlen!
26|
--
35|-- grün färben, ...
36|
usw.

Ich habe keine Idee, wie ich das ganze effektiv rendern soll, da in der Tabelle ca. 320.000 Datensätze sind!

Ich hoffe ihr könnt mir helfen und schon mal Danke im Voraus!

Gruß
Iron Monkey
 
was ist eine Tabelle, was ist eine Spalte? geht es um Swing, JTable?
auch bei 300.000 Datensätzen wird doch wohl die Spaltenanzahl konstant bei maximal 10 oder so liegen?
willst du nicht eher einzelne Zellen färben?

dein Beispiel sieht bisschen komisch aus, ist da was verrutscht? 'da zwischen 3 und 5 die 4 fehlt!' schon auf Höhe der 2?
edit: oder betrifft es alle Zahlen dort? (*)
hat es eine Bedeutung, dass du einmal 'weiß' und dreimal 'grün' färben willst?

grundsätzlich gibt es ja Code-Beispiele für Färberung von Spalten oder eher einzelnen Zellen,
das findet natürlich bzw. als Vorschlag programmatisch statt, Schleife, oder Methode die pro Zelle aufgerufen wird
(Renderer, erstmal Beispiele kennenlernen)
und wenn es zur Frage der Farbe eines Elementes kommt, dann genau ein passendes if programmieren, welches etwa die Werte aus den Daten zu den benachbarten Einträgen sucht und schaut ob Lücke vorhanden oder nicht

edit:
wenn (*) gilt oder sonstwie etwas komplizierten,
dann könntest/ solltest du irgendwo nahe der Daten zusätzliche vorberechnete Informationen ablegen,
die in einem Durchgang, nicht bei jeder Zelle neu, bestimmt werden,
z.B. zu jedem Eintrag eine Color-Variable
 
Zuletzt bearbeitet von einem Moderator:
OK, vielleicht habe ich nicht so ganz klar ausgedrückt!

Es handelt sich um einen Swing -> JTable! Ich weiss, dass der Renderer auch nur die Sichtbarkeit der JTable verarbeiten kann! Ich schreibe gerade eine Funktion dafür! Mal sehen, ob ich das hinkriege! Wenn nicht, werde ich hier veröffentlichen!

Also, mein Beispiel soll so aussagen, wie der Renderer von 1 bis ganz nach unten der Spalte durchprüfen, ob dort Zwischenlücken gibt, d.h. siehe Beispiel: Die 4 fehlt, das bedeutet, dass 1, 2 und 3 sollen in grün gefärbt werden und wenn es die nächste Zwischenlücke wiederkommt, dann weiss, dann grün, usw.! Zwischen 5, 6, 7 gibt es natürlich keine Lücke, also gehören die zusammen eine Farbe!

Ich hoffe, dass ich die Beschreibung noch näher erklärt habe und bei Fragen stellen Sie ruhig!

Gruß
Iron Monkey
 
Zuletzt bearbeitet von einem Moderator:
So, das ist jetzt meine Funktion, die zwar noch nicht ganz sauber funktioniert:

Das Problem ist nur, dass die Farbdarstellung nicht fest bleibt! Es wechselt immer wieder, wenn ich z.B. die JTable scrolle, usw.!

Code:
		int diffNummer 	= 0;

		Object firstValue 	= table.getValueAt( fromRow, searchColumn );
		Object lastValue 	= table.getValueAt( ( ( ( fromRow + 1) >= table.getRowCount() ) ? table.getRowCount()-1 : fromRow + 1 ), searchColumn );

		if( firstValue != null && lastValue != null )
		{
			diffNummer = Integer.valueOf( firstValue.toString() ) - Integer.valueOf( lastValue.toString() );

			// Differenz kleiner als -1 oder größer als 1
			if( diffNummer < -1 || diffNummer > 1 )
			{
				firstValue = null;
				lastValue = null;
				
				if( !CHANGE_COLOR )
				{
					CHANGE_COLOR = true;

					return Color.WHITE;
				}
				else
				{
					CHANGE_COLOR = false;

					return groupColor;
				}
			}
		}

		firstValue = null;
		lastValue = null;
		
		if( !CHANGE_COLOR )
			return Color.WHITE;
		else
			return groupColor;

Ich hoffe, ihr findet den Fehler! 🙂

Gruß
Iron Monkey
 
auch womöglich statische Variablen schreibt man klein,
die CHANGE_COLOR-Schreibweise bitte nur für Konstanten, und du veränderst ja munter..

CHANGE_COLOR scheint anscheinend vom vorherigen Ablauf einen zufälligen Wert zu haben,
zudem beginnt man je nach Scrollstand irgendwo in der Liste, da ist es wirklich schwer ein System zu finden

(alle Bäume an einer Allee werden gedanklich ab Ortsausgang abwechselnd gerade/ ungerade bezeichnet,
wie soll man in der Mitte wissen welche was sind, abwechselnd ist klar, aber reicht nicht)

du musst also feste Kennzeichnungen vergeben, anders gehts nicht,
die Daten einmalig durcharbeiten, für jeden Index die Farbe ausrechnen und ablegen,

wenn die table-Daten keinen Platz für Color haben, dann evtl. separate Datenstruktur, etwa eine Map Index -> Color,
oder auch nur in einem Set die Indexe merken, die grün sind, rest dann die andere Color
 
Hi!

auch womöglich statische Variablen schreibt man klein,
die CHANGE_COLOR-Schreibweise bitte nur für Konstanten, und du veränderst ja munter..

Stimmt, das war nicht mit Absicht! Soweit berichtigt! ;-)

CHANGE_COLOR scheint anscheinend vom vorherigen Ablauf einen zufälligen Wert zu haben,
zudem beginnt man je nach Scrollstand irgendwo in der Liste, da ist es wirklich schwer ein System zu finden

(alle Bäume an einer Allee werden gedanklich ab Ortsausgang abwechselnd gerade/ ungerade bezeichnet,
wie soll man in der Mitte wissen welche was sind, abwechselnd ist klar, aber reicht nicht)

Richtig, das macht auch keinen Sinn! Da habe ich nicht drüber nachgedacht!

du musst also feste Kennzeichnungen vergeben, anders gehts nicht,
die Daten einmalig durcharbeiten, für jeden Index die Farbe ausrechnen und ablegen,

wenn die table-Daten keinen Platz für Color haben, dann evtl. separate Datenstruktur, etwa eine Map Index -> Color,
oder auch nur in einem Set die Indexe merken, die grün sind, rest dann die andere Color

Wieso ist mir das nicht darauf gekommen? Natürlich, genau dieses Problem habe ich soweit gelöst, indem ich einmalig die Daten in die Map ( Index -> Color ) schreibe und der Renderer braucht nur praktisch die Farbe aus der Map holen!

Danke für den Tipp! ;-)

Gruß
Iron Monkey
 
Wenns darum geht, eine Folge von Zeilen unabhängig von ihrer Zeinennummer zu färben, ist die Zeilennummer als "Laufvariable" eine ganz ganz schlechte Wahl. Vielmehr sollte man eine "virtuelle" Zeilennummer verwenden, die, egal ob etwas fehlt oder nicht, pro vorhandener Ausgabezeile inkrementiert und auf die Anzahl der Farben moduliert wird.
Java:
Map<Integer, String> lines = myLineNumberedTextDocument;
Color[] colors = new Color[] {Color.GREEN, Color.WHITE};
int color = 0;
for(Entry<Integer, String> line : lines.entrySet()) {
  Color out = colors[color];
  // gefaerbte Ausgabe von line
  color++;
  color %= colors.length;
}
 
[c] // gefaerbte Ausgabe von line[/c]
hat mit JTable, Renderer, Scrollen, nicht grad viel zu tun
 
Das Beispiel so vllt. nicht, aber die Praxis lässt sich mit Sicherheit auch in einem CellRenderer, TableModel oder was immer auch für die Ausgabe verantwortlich ist implementieren. Wäre ja schlimm, wenn nicht.
 

Zurück
Oben