JTable => Renderer

MariusMeier

Mitglied
Hallo zusammen

Ich habe da folgendes Problem: Ich habe genau eine Zeile und 120 Spalten in meiner Tabelle. Ich will die Zellen mit der Maus markieren und dann über ein JCheckBox eine Farbe auswählen und auf Knopfdruck bestätigen, so dass sich die Zellen einfärben.
Wie muss ich das genau machen? Ich weiss dass es mit dem Renderer gemacht wird. Verstehe aber die jeweiligen Beispiele nicht ganz. Wäre froh um einen anderen Ansatz?

MFG Marius
 
Hallo zusammen

Ich habe mal folgendes probiert:

Code:
btCreateSequence.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(e.getActionCommand() == "Add Sequence") {
					System.out.println("OK");
					buttonpressed = true;
					TableColumn col;
					System.out.println("SelectedColumns: " + sequenceTable.getSelectedColumns().length);
					for(int i=0;i<sequenceTable.getSelectedColumns().length;i++) {
						renderer.setBackground((Color)cbChooseColor.getSelectedItem());
						col = sequenceTable.getColumnModel().getColumn((sequenceTable.getSelectedColumns())[i]);
						System.out.println("Selected Columns data: " + (sequenceTable.getSelectedColumns())[i]);
						col.setCellRenderer(renderer);
						
						sequenceTable.repaint();
					}
				
					
				}
			}
		});

Wenn ein Zellenbereich markiert wurde, kann der User auf einen Button klicken und dieser Zellenbereich wird dann eingefärbt.
Problem: Falls der User einen neuen Zellenbereich selektiert und eine neue Farbe festlegt, ändert sich auch die Farbe des vorgehenden selektierten Zellenbereichs. Dies wahrscheinlich weil der renderer immer noch eine Referenz auf die vorgehenden Zellen hat. Wie kann ich diese Referenz lösen/löschen sodass ich die nächsten selektierten Zellen einfärben kann?

MFG Marius
 
Hallo,
ohne jetzt Deinen Code genauer angeschaut zu haben...
Wenn ich es richtig verstehe hast Du pro Spalte einen Renderer assoziiert.
Die Strategie von JTable ist zunächt die, möglichst wenige Renderer zu haben und diese für die Darstellung der Zellen wie einen Art Stempel wiederzuverwenden, wobei er halt alles im Sichtbaren Bereich neu gezeichnet wird.
Du müsstest, so denke ich, demnach einen Renderer bauen, der, so er mit der Spalte assoziiert ist, auch die Zeile mitbekommt und diese beispielsweise in einer Map mit der selektierten Farbe zusammen merkt. Dann müsste er bei Aufruf durch den JTable-mechanismus die Farbe über die Zeile von der Map abfragen und verwenden. Ist die Zeile nicht defineirt, die Farbe also null, verwendest Du einfach die Standardfarbe.
Um noch etwas variabler zu sein, würde ich den Spaß sowohl mit der Hintergrund als auch mit der Vordergrund Farbe (in getrennten Maps) implementieren

viel Glück

Takidoso
 
Wie kann man dann per Knopf Druck den Renderer aufrufen, den ich gebastelt habe?
ich befürchte die Fage ist unglücklich gestellt.
Ich nehme an Du meinst ungefär so etws:
benutzer klickt auf eine Zelle im JTable und erhältdaraufhin einen Dialog zu Auswählen der Farbe.
Stimmts?
Das ist dann kein Cell-Renderer sonden ein Cell-Editor.
Allerdings bin ich mir nicht sicher, ob es in Deinem Anwendungsfall vielleicht auch reicht einen ActionListener an den JTable zu bringen, der dann einen ColorChooser-Dialg anzeigt und sowohl die Farbe als auch die selektierte Zeile dem in meiner ersten Antwort erläuterten Renderer übergibt. dieser Renderer würde die Daten dann in seiner Map speichern und zu gegebenen Aufruf durch JTable (bei jedem repaint) verwenden.
 
Zuletzt bearbeitet:
Hallo zusammen

Ich habe da folgendes Problem: Ich habe genau eine Zeile und 120 Spalten in meiner Tabelle. Ich will die Zellen mit der Maus markieren und dann über ein JCheckBox eine Farbe auswählen und auf Knopfdruck bestätigen, so dass sich die Zellen einfärben.
MFG Marius

Der Renderer ist für die Darstellung gedacht, nicht dafür Daten zu speichern. Wenn du in der Tabelle einzelnen Zellen Farben zuweisen kannst gehoert diese Information in das Tabellenmodel respektive in die Datenobjekte, die das Tabellenmodel enthaelt.
 
Der Renderer ist für die Darstellung gedacht, nicht dafür Daten zu speichern. Wenn du in der Tabelle einzelnen Zellen Farben zuweisen kannst gehoert diese Information in das Tabellenmodel respektive in die Datenobjekte, die das Tabellenmodel enthaelt.
stimmt, da gebe ich Dir recht, da spart man sich zusätzliches Geschnörkel. Zumal Renderer state less zu bevorzugen sind.
 
Zurück