Schriftfarbe in Tabellenzellen ändern

Status
Nicht offen für weitere Antworten.

hawkeye78

Bekanntes Mitglied
Hallo,

ich versuche mich mal wieder an einem kleinen Kalender, die Oberfläche und die Funktionalitäten habe ich nun mittlerweile zusammen. Allerdings würde ich nun gerne noch die Schrift für die Sonntage in Rot darstellen, aber genau daran hakt es bei mir momentan. Ich rufe aus der Klasse in welcher ich die Oberfläche darstelle folgende Klasse auf:

Code:
import java.awt.Color;

import javax.swing.*;
import javax.swing.table.*;

public class Tabelle
extends DefaultTableCellRenderer
{
	public int AnzahlZeilen=0;
	
	Datum dat1=new Datum();        // Erzeugen eines Objekts für die Datumberechnung
	Color color;                   // Datentyp für die Farbe erzeugen
	
	public void fuellen(int iMonth, int iYear, Oberflaeche o2)
	{
		int ifirstDay=99;                // Wochentag des ersten Tages im Monat
		int ileerzellen=99;              // Anzahl der leerzellen am Monatsanfang
		int iSchaltjahr=0;               // Schaltjahr (1=ja, 0=nein)
		int iTage=1;                     // Tage des Monats
		int iRestWoche=0;
		int iDayofMonth=0;               // Anzahl der Tage im Monat
		int i=0;                         // Zählvariable
		String sTag;
		int iTagederMonate[]={31,28,31,30,31,30,31,31,30,31,30,31};
		
		JTable TabdaysofMonth1=o2.getTable();
		
		// Definition des Modells für die Tabelle
		DefaultTableModel aModel (DefaultTableModel)TabdaysofMonth1.getModel();

		Object[] Woche=new Object[7];    // Objekt für die Woche;
		
		// Löschen der vorhandenen Tabellenzeilen
		for(i=0; i<AnzahlZeilen; i++)
		{
			aModel.removeRow(0);
		}

		// Hier werden die Spaltenköpfe hinzugefügt
		
		AnzahlZeilen=0;            // Zurücksetzen der Zeilen-/Wochenanzahl

		// Bestimmung des Wochentages für den 1. im Monat (0=So, 1=Mo, 2=Di, 3=Mi,
		// 4=Do, 5=Fr, 6=Sa)
		ifirstDay=dat1.ErsterTag(iMonth, iYear);

		// Berechnung der leerzellen vor dem Monatsanfang
		if(ifirstDay==0)
		{
			ileerzellen=6;
		}
		else
		{
			ileerzellen=ifirstDay-1;
		}
		
		// Überprüfung ob der aktuelle Monat Februar ist
		if(iMonth==2)
		{
			// Bestimmung des Schaltjahres
			iSchaltjahr=dat1.schaltjahr(iYear);
			
			iDayofMonth=iTagederMonate[iMonth-1]+iSchaltjahr;
		}
		else
		{
			iDayofMonth=iTagederMonate[iMonth-1];
		}
		
		while(iTage<=iDayofMonth)
		{
			if(ileerzellen!=0)
			{
				// Auffüllen der Leerzellen für die erste Monatswoche
				for(i=0; i<ileerzellen; i++)
				{
					Woche[i]=" ";
				}
				
				// Auffüllen der angefangenen Woche
				iRestWoche=7-ileerzellen;
				
				while(i<7)
				{
					Woche[i]=String.valueOf(iTage);
					iTage++;
					i++;
				}
				ileerzellen=0;				
			}
			else
			{
				// Füllen der Woche mit den entsprechenden Tagen
				for(i=0; i<7; i++)
				{
					sTag=String.valueOf(iTage);
					
					if(i==6)
					{
						this.setValue(sTag);
					}
					
					Woche[i]=sTag;
					iTage=iTage+1;

					// Auffüllen der Felder mit leerzeichen am Monatsende
					if(iTage-1>iDayofMonth)
					{
						Woche[i]=" ";	
					}
				}					
			}

			aModel.addRow(Woche);
			AnzahlZeilen=AnzahlZeilen+1;
		}
		TabdaysofMonth1.setModel(aModel);			
                }
	
	// Schrift für den Sonntag auf rot setzen
	public void setValue(Object value)
	{
		String Sonntag=value.toString();
		setForeground(Color.red);
		setText(Sonntag);
	}
}
Ich wäre über einen Tipp geben, warum das Programm die Schriftfarbe weiterhin auf Schwarz läßt. Ich bin leider ziemlich ratlos warum das nicht funktioniert und wäre daher über einen entsprechenden Tipp sehr sehr dankbar.
Gruß
Dan
 
ehrlich gesagt würde ich mehr trennen. D.h. mach eine Klasse die sich um die Anzeige der Tabelle kümmert und eine die vom CellRenderer erbt....

Nichtsdestotrotz musst du der Tabelle noch den CellRenderer setzen !
 
erst einmal vielen Dank für dein Posting, ich werde das wohl noch ein bißchen aufsplitten, aber ich dachte die Klasse erbt den Renderer schon wenn ich einfach extends DefaultTableCellRenderer angebe oder, muß ich auch noch
Code:
Component getTableCellRendererComponents(JTable table, Object value, boolean isSelected, boolean has Focus, int row, int column)

mit einbauen? Aber falls ja wie? Noch einmal vielen Dank für dein Posting.
 
das mit dem erben ist schon richtig - mehr brauchst du nicht machen.
Nichts desto trotz muss der tabellle der Renderer gesetzt werden.
Code:
table.setCellRenderer(new MyCellRenderer());
Bei dir dann:
Code:
TabdaysofMonth1.setCellRenderer(this);

PS: Variablen immer klein schreiben !
 
noch einmal vielen Dank für dein Posting, aber irgendwas scheine ich immer noch falsch zu machen, wenn ich jetzt die Codezeile:

Code:
JTable TabdaysofMonth1=o2.getTable(); 
       
// Definition des Modells für die Tabelle 
DefaultTableModel aModel (DefaultTableModel)TabdaysofMonth1.getModel();

TabdaysofMonth1.setCellRenderer(this);
schreibe behauptet Eclipse die Methode setCellRenderer ist für den Typ JTable nicht definiert :cry: entschuldige bitte wenn ich dich so nerve aber ich bin noch ein ziemlicher Anfänger in Java
 
Mal ein wenig in der API Specification nachschauen würde hefen. Die richtige Methode ist "setDefaultCellRenderer(Class columnClass, TableCellRenderer renderer)".
 
ok, danke für den Tipp, es gibt hin und wieder so ein paar Tage da sollte ich besser morgens im Bett bleiben das scheint einer davon zu sein 🙂
ich habe das nun folgendermaßen geändert
Code:
[...]
    DefaultTableRenderer ren=new Tabelle();
    TabdaysofMonth1.setDefaultRenderer(Tabelle.class,ren);
[...]

aber irgendwie hat das keinen Einfluß auf die Schrift in der Tabelle, könnst du mir vielleicht sagen was ich noch falsch mache? NOch einmal vielen Dank für eure hilfe.
 
Am besten du machst das so:
Code:
DefaultTableRenderer ren=new Tabelle();
TableColumnModel model = TabdaysofMonth1.getColumnModel();
TableColumn column = model.getColumn(int columnIndex); //den richtigen index übergeben (erste Spalte wäre 0)
column.setCellRenderer(ren)
 
du verwirrst mich... :roll:
warum muß ich jetzt explizit eine spalte ansprechen? kann ich den renderer nicht für die gesamte Tabelle setzen und dann nur beliebige zellen mittels setValue editieren? oder habe ich da was bei den renderern vollkommen falsch verstanden?
 
der CellRenderer muss für jede Zeile gesetzt werden. Es könnte ja auch sein, dass du mehrer untersch. Renderer setzen willst.

Der Renderer hat nichts mit der setValue Methode des Models zu tun. Die kümmert sich darum, dass Daten in die Tabelle kommen - wie die Daten dann angezeigt werden wird über den Renderer gemacht
 
also darf ich nun die daten nicht mehr direkt mit der schleife in die Tabelle schreiben? sondern muß über die Methode valueat gehen? ich dachte immer ich könnte die daten erst in die Tabelle schreiben und dann die entsprechenden Elemente abändern
 
hawkeye78 hat gesagt.:
kann ich den renderer nicht für die gesamte Tabelle setzen ...?

Du kannst den Renderer für die gesamte Tabelle setzen mit "setDefaultCellRenderer(Class columnClass, TableCellRenderer renderer)", wobei "Class columnClass" den Datentyp für den der Rendere genutzt wird angibt. Wenn Du also für "Class columnClass" "String.class" übergibst, werden alle Zellen die ein Value vom Typ String beinhalten mit diesem Rendere gerendert. Mit dem anderen Weg setzt Du den Renderer für eine Spalte. In Deinem Fall dürfte der es also gehen, wenn Du die Methode "setDefaultCellRenderer" nutzt, nur hast Du mit "Tabelle.class" einen völlig sinnlosen Typ übergeben. Versuch es mal mit "String.class".
 
Ich wünsche allerseits einen wunderschönen guten Morgen 🙂

leider funktioniert das Programm immer noch nicht so wie ich mir das wünschen würde, ich habe nun folgende Codezeilen in dem Programm stehen

Code:
DefaultTableCellRenderer ren=new Tabelle();
TabdaysofMonth1.setDefaultRenderer(String.class,ren);

Wie kann ich damit nun die einzelnen Zellen ansprechen um die Schriftfarbe zu ändern? Über die setValue Methode funktioniert das irgendwie nicht richtig oder rufe ich die Methode nur falsch auf?
 
Ruf mal bei Deiner Tabelle "getValueAt(int row, int column).getClass()" auf, nachdem Du das TabelModel fertig und der Tabelle gesetzt hast. Lass Dir das Ergebniss mal ausgeben und sag mal bescheid. Wenn dort Object und nicht String rauskommt, dann nimm mal Object.class als Parameter bei setDefaultRenderer.
 
Jetzt funktioniert es 😀 das einzige was jetzt nach wie vor nicht funktioniert ist die Definition für einzelne Zellen mittels der setValue Methode. Aber ich denke damit kann ich nun leben da ich den Renderer jetzt auf die Spalte gesetzt habe. Wenn du magst kann du mir ja noch einmal einen Tipp geben warum er bei der gesamten Tabelle die Schrift in allen Zellen einfärbt.
Aber ich möchte mich noch einmal für deine Geduld (ich weiss das ich hin und wieder ziemlich langsam begreife) und deine Erläuterungen bedanken
 
Du setzt ja bei Deinem Renderer auch immer die Farbe rot.
Code:
// Schrift für den Sonntag auf rot setzen
//diese Methode wird immer bei "getTableCellRendererComponent" aufgerufen
public void setValue(Object value) 
{ 
    String Sonntag=value.toString(); 
    //hier wird !!! immer !!! die Farbe auf rot gesetzt
    setForeground(Color.red); 
    setText(Sonntag); 
}
Deine Wert (also der Text) ist bei Dir ja nur der Tag des Monats (1, 2, ...) oder?Du müsstest also in Deiner Methode setValue überprüfen, ob es sich um einen Sonntag handelt und nur dann die Farbe auf rot setzen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben