JTable update was ist nun wieder falsch?

equestenebrarum hat gesagt.:
Und was war der Preis? ;)

Ein korrektes Verhalten des Programms in Richtung Do_What_I_Mean ;)

Du scheinst Dich ja wirklich super mit Tabellen auszukennen. Da hab ich gleich noch eine Frage... ich möchte die Zellen in einer großen Tabelle alle einzeln einfärben, abhängig vom Wert, den sie zu einem fixen Zeitpunkt enthalten. Folgendes funktioniert nicht wie erwartet.

JTable SumTable = new JTable(m);

TableCellRenderer cr = SumTable.getCellRenderer(0,0);
((DefaultTableCellRenderer)cr).setBackground(Color.red);

cr = SumTable.getCellRenderer(0,1);
((DefaultTableCellRenderer)cr).setBackground(Color.green);

Muss ich für jede einzelne Zelle ein eigenes cell-Renderer-Object erstellen? Dann ist der Overhead wohl so groß, dass die Lösung nicht sooo sinnvoll ist. Fällt Dir da eine elegantere Lösung ein?

In meinem Beispiel ist es übrigens so, dass die Zellenwerte Integer-Werte repräsentieren und mit verschiedenen Grüntönen deren Größe wiedergespiegelt werden soll.

Ganz einfach. Du schreibst Dir für die Tabelle einen eigenen Renderer für Integer.class.
Entweder MyRenderer extends DefaultTableCellRenderer oder bastelst einen eigenen Renderer, z.B.
MyRenderer extends JLabel implements TableCellRenderer
Für beide Fälle implementierst Du die Methode
getTableCellRendererComponent(...) nach Deinen Wünschen. Die Integer-Werte bekommst Du als Parameter "value" übergeben - vorausgesetzt Du liest sie mit getValueAt auch als Integer aus.
 
Du hast wieder Recht. Gebenen habe ich eine fertig gerenderte Tabelle, und darin muss ich jetzt für _einzelne_ Zellen (nicht z.B. ganze Columns) den default renderer ersetzen. Aber das Konzept einer einzelnen Zelle gibt es gar nicht, wenn ich das richtig überblicke.

Es gibt zwar eine getCellRenderer-Methode, die mir den in einer Zelle verwendeten Renderer liefert, aber der wird eben nicht nur für diese eine Zelle genutzt.
 
Als Workaraound könnte ich mir evtl. eine Tabelle vorstellen, die eine Menge von TableModels enthält, näml. genau 1 für jede Zeile. Aber das ist a) nicht schön und b) existiert die Tabelle auch schon...
 
Lies bitte GENAU was ich geschrieben habe. Von getCellRenderer war nicht die Rede, sondern von einem eigenen TableCellRenderer, in dem Du getTableCellRendererComponent überschreibst bzw Deinen Wünschen entsprechend anpasst. Diesen eigenen Renderer weist Du einer Klasse zu:

myTable.setDefaultRenderer(deinRenderer, Integer.class)

Damit wird allen Spalten, die als Klasse Integer haben, deinRenderer zugewiesen, womit getTableCellRenderer in Deiner Renderer-Klasse aufgerufen wird. Allerdings musst Du dafür natürlic die Methode getColumnClass im TableModel entsprechend umsetzen.
 
Hab's schon am laufen, hab hier hilfreiche Antworten bekommen:

h**p://forum.java.sun.com/thread.jspa?threadID=617334&start=0&tstart=0

Die einfachste Lösung ist, sowas hier

if(row == 0 && column == 0) oder if(value irgendwas)
setBackground(new Color(111,111,150));
else setBackground(new Color(255,255,255));

in die getTableCellRendererComponent-Methode einzufügen. Ich hatte es zuvor immer ohne das else ausprobiert, aber das haut nicht hin!

@Snape
Nochmal vielen Dank für Deine Hilfe
 
Oh, hab geantwortet ohne Dein letztes Posting gesehen zu haben. Ja, genau so habe ich es gemacht!

public class TickDataRenderer extends JCheckBox implements TableCellRenderer{ [..]

und darin die getTableCellRendererComponent passend überschrieben.
 

Neue Beiträge

Zurück