JTable für Stundenplan färben

redo088

Mitglied
Hallo,

ich will ein JTable färben lassen für ein Stundenplan. Es müssen zwei Kurse voneinander unterscheiden
lassen durch zwei verschiedene Farben. Man kann den Renderer anwenden, aber ich weiss nicht
wie man das in den Renderer anpassen könnte.

hier füge ich ein Bild hinzu, damit sie wissen, was ich meine.

Gruss
 
hallo,

ich kenne den renderer schon. Aber das Problem ist, ich habe es immer nicht hingekriegt, dass 2 Fächer unterschiedliche Farben kriegen ??

hier ist mein Code

class MyRenderer1 implements javax.swing.table.TableCellRenderer {


public Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
javax.swing.JTextField editor = new javax.swing.JTextField();

if (value != null) {



editor.setText(value.toString());

editor.setFont(new java.awt.Font("Tahoma", 1, 12));
editor.setBackground(new java.awt.Color(232, 189, 204));

}
editor.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

editor.setBorder(new javax.swing.border.BevelBorder(0));
return editor;
}
}
 
Ergänzung: Du könntest den "kursen" eine Methode geben die eine Farbe zurückliefert (also
Code:
getBackground
o.ä.). Dann kannst du einfach aus dem Renderer heraus
Code:
setBackground(kurs.getBackground());
aufrufen.


Bitte java code immer in einer Java Umgebung schreiben indem du den Code in Java-Tags also [ JAVA ] und [ /JAVA ] einschließt. (ohne leerzeichen)

edit:
Du kannst es so machen wie eben beschrieben. Du fügst deiner Tabelle keine Strings hinzu sondern Objekte von einem Selbst erstellten Typ, zB
Java:
//per Hand geschriebener Code, tippfehler möglich
public class Kurs{
  String descr;
  Color bg;
  public Kurs(String descr, Color bg){
    this.descr = descr;
    this.bg = bg;
  }

  public Color getBackground(){
    return bg;
  }
}

Dann kannst du im Renderer einfach schreiben:
Java:
if (value instanceof Kurs){
  Kurs k = (Kurs) value;
  editor.setBackground(k.getBackground());
}

und wenn du möchtest
Java:
@Override
public String toString(){
  return descr;
}
 
Zuletzt bearbeitet:
Du mußt natürlich an irgendeiner Stelle (entweder im Renderer, oder aber whl. besser im Kurs, oder noch besser in einer Methode, die zum Kurs die Farbe gibt) festellen, welche Farbe gesetzt werden soll.
 
ja sorry mit der Umgebung wusste. Werde ich immer machen 🙂.

Aber ich weiss nicht was du mit setBackground(...) meinst , und wie kann ich das machen?

ich habe versucht mit HashMap<Integer, Color> so dass die Vorherige Zeile in den Hash gesperichert
wird, aber es kommt ein NULLPOINTEREXCEPTION???
 
Mal ein paar Anmerkungen zu Deinem Renderer:
(- ich persönliche erbe lieber vom DefaultTableCellRenderer als TableCellRenderer zu implementieren)
- die Renderingkomponente (warum ein JTextField und nicht ein JLabel) nur einmal erzeugen, sonst macht man ja das ganze Renderingkonzept zu nichte
- man könnte vorher einfach definieren, welcher Kurs welche Farbe zugewiesen bekommt
und dann anhand dessen im Renderer den Hintergrund setzen
- oder wie von Morl vorgeschlagen eigene Kursobjekte ins TableModel stecken

Hier mal eine leicht überarbeitete Variante Deines Renderers
Java:
	class MyRenderer1 implements javax.swing.table.TableCellRenderer {
		
		private JLabel renderer;
		
		public MyRenderer1() {
			renderer = new JLabel();
			renderer.setOpaque(true);
			renderer.setFont(new java.awt.Font("Tahoma", 1, 12));
			renderer.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
			renderer.setBorder(new javax.swing.border.BevelBorder(0));
		}
		
		public Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected,
				boolean hasFocus, int row, int column) {
			if (value != null) {
				renderer.setText(value.toString());
				//Hier den Hintergrund abhängig von value setzen
			}
			else {
				renderer.setText("");
				renderer.setBackground(Color.WHITE);
			}
			return renderer;
		}
	}
 

Zurück
Oben