TableCellRenderer: Ändern des Values

Status
Nicht offen für weitere Antworten.
F

Flow25

Gast
Hallo zusammen,

in meiner Anwendung gibt es eine Tabelle mit Eurobeträgen. Nun habe ich eine Funktion eingebaut, mit der der User einstellen kann, ob die Erträge als Plus oder die Aufwände als Plus dargestellt werden soll.
Die Tabelle besitzt einen TableCellRenderer, den ich selbst implementiert habe. Sobald der Benutzer nun die Ansicht der Daten umschaltet, so wird der Tabelle ein anderer TableCellRenderer zugewiesen, in dem ich den Wert jedes Labels der Tabelle (jede Zelle) mal -1 nehme. Anschließend weise ich dem value diesen neuen Wert wieder zu.
Da der CellRenderer ja permanent aufgerufen wird, auch während die Tabelle schon längst erstellt ist, musste ich verhindern, das der Renderer jede Zelle mehrmals * -1 nehmen.
Das habe ich so gelöst:

Code:
if (column == 4 || column == 6 || column == 8 || column == 10)
{
	label.setFont(new Font("Arial", Font.BOLD, 12));
	
 	if (!(zeilen.contains(String.valueOf(row) + String.valueOf(column))))		
 	{
	 	String w = String.valueOf(value);
		StringBuffer wBuffer = new StringBuffer(w);
		int pos;
		while ((pos = wBuffer.indexOf(".")) != -1)
		{
			wBuffer.deleteCharAt(pos);
		}
		int kPos = wBuffer.indexOf(",");
		wBuffer.setCharAt(kPos, '.');
		String umgew = String.valueOf(wBuffer);
		System.out.println("Wert = " + umgew);
		double wert = Double.parseDouble(umgew);
		wert = wert * -1;
		value = String.valueOf(df2.format(wert));
		System.out.println("Wert2 = " + String.valueOf(value));
		zeilen.addElement(String.valueOf(row) + String.valueOf(column));
 	}
 	System.out.println(zeilen.size());
			 
}

Der Vector ist global deklariert und speichert die bereits geänderten Zellen der Tabelle in der Form
ZeileSpalte.

Leider ändert sich nichts an der Darstellung der Daten, beim Umschalten der Datenansicht.

Woran kann das liegen??

P.S.: Ich weis dass das Ganze nicht unbedingt die konventionelle Herangehensweise einer solchen Problematik ist, aber da die Anwendung fast fertig und sehr umfangreich ist, würde ich ungerne irgendetwas komplett ändern.


Gruß Flow25
 
F

Flow25

Gast
kleine Zusatzinfo:

Es liegt NICHT daran, dass die Tabelle nicht aktualisiert wird. Ich aktualisiere mit repaint() und invalidate() - validate().

Gruß Flow25
 

Sky

Top Contributor
Werden die Werte denn korrekt ausgegeben (vgl. System.out.println(...) )??

Falls ja, vermute ich die Ursache darin, dass Du deinen Wert niemals dem label zuweist (mittelst 'setText()') sondern immer nur 'value' änderst.

BTW: Die Änderung von 'value' und dein globaler Vector sind nicht nötig!
 
F

Flow25

Gast
Ja die Werte werden zumindest in der Konsole korrekt ausgegeben.

Warum sind die Änderung von value und der globale Vector nicht notwendig??

Wie bzw. an welcher Stelle des CellRenderers kann ich denn dem label per settext() den Wert zuordnen?

Gruß Flow25
 

Sky

Top Contributor
Das ganze müßte m.E. so aussehen:
Code:
    if (column == 4 || column == 6 || column == 8 || column == 10) {
      label.setFont(new Font("Arial", Font.BOLD, 12));
      String w = String.valueOf(value);
      // diese Umwandlungen hier kann man bestimmt schöner lösen!
      // bin mir nicht sicher, wie man das umgehen kann
      w = w.replaceAll("\\.", "");
      w = w.replaceAll("\\,", ".");
      double wert = Double.parseDouble(w);
      wert = wert * -1;
      label.setText(String.valueOf(df2.format(wert)));
    }
 
F

Flow25

Gast
OK danke nun setzt er zumindest solange die Werte in der Tabelle um bis ich mich in der Tabelle bewege.
Und das trotz des globalen Vectors.

Wie kann ich sicherstellen, dass die Umrechnung mal -1 nur einmal pro Zelle stattfindet und nicht mehrmals??

Gruß Flow25
 

Sky

Top Contributor
Vergiß den Vector. Ich verstehe nicht, wofür Du den brauchst.

Nochmal: Nimm deinen Renderer (der ja anscheinend von JLabel abgeleitet ist oder zumindestens eines benutzt) und mache aus value ein double (bzw. ein double * -1) und setze dies per setText anstatt die Variable 'value' zu ändern!
Eigentlich mußte nur meine Code nehmen ;-)
 
F

Flow25

Gast
Ich habe es ja dank deiner Hilfe hinbekommen, dass nach dem Umstellen der Datenansicht, die
Daten in der Tabelle korrekt dargestellt werden.
Aber sobald ich z.B. in der Tabelle herunterscrolle oder eine Zeile anklicke, werden die Werte wieder
zurückgesetzt. Ich vermute dass es daran liegt, dass eine Tabelle permanent per CellRenderer aktualisiert wird.
Die Labels des Cellrenderers werden also permanent aktualisiert, z.B. beim Scrollen in der Tabelle.
Da dann auch die Umrechnung des Labelwertes * -1 mehrfach vorgenommen würde habe ich versucht das mit dem globalen Vector zu verhindern. Aber das scheint ja nicht zu funktionieren.

Hast du keine Idee wie ich das Problem lösen kann?

Gruß Flow25
 
F

Flow25

Gast
Code:
public class ChangedTableCellRenderer
implements TableCellRenderer
{
	
	private Color lightBlue = new Color(160, 160, 255);
	private Color darkBlue = new Color(64, 64, 128);
	private int row1 = 2000, row2 = 2000, row3 = 2000, row4 = 2000, row5 = 2000, row6 = 2000;
	private int row7 = 2000, row8 = 2000, row9 = 2000, row10 = 2000, row11 = 2000, row12 = 2000;
	private int row13 = 2000, row14 = 2000, row15 = 2000, row16 = 2000, row17 = 2000, row18 = 2000;
	private int row19 = 2000, row20 = 2000, row21 = 2000, row22 = 2000, row23 = 2000, row24 = 2000;
	private int row25 = 2000, row26 = 2000, row27 = 2000, row28 = 2000, row29 = 2000, row30 = 2000;
	private int row31 = 2000;
	private int Datenansicht;
	private double Gruen, Gelb;
	private int Zwei, Eins;
	private DecimalFormat df2 = new DecimalFormat("#,###,##0.00");
	private Vector zeilen = new Vector();
		
	public Component getTableCellRendererComponent(
	JTable table,
	Object value,
	boolean isSelected,
	boolean hasFocus,
	int row,
	int column
	)
{
		Ini_Datei i = new Ini_Datei();
		Datenansicht = i.getDatenansicht();
		Gruen = i.getGruen();
		Gelb = i.getGelb();
		
		JLabel label = new JLabel((String)value);
		label.setOpaque(true);
		Border b = BorderFactory.createEmptyBorder(1, 1, 1, 1);
		label.setBorder(b);
		label.setFont(table.getFont());
		label.setForeground(table.getForeground());
		label.setBackground(table.getBackground());
		if (hasFocus)
		{
			label.setBackground(darkBlue);
			label.setForeground(Color.white);
		}
		else if (isSelected)
		{
			label.setBackground(darkBlue);
			label.setForeground(Color.white);
			
		}
		else
		{
			column = table.convertColumnIndexToModel(column);
			 
			Font f1 = new Font("Arial", Font.BOLD, 12);
			Font f2 = new Font("Arial", Font.BOLD, 13);
			Font f3 = new Font("Arial", Font.BOLD, 14);
			
			
			if (row % 2 == 0 || row == 0)
			{
				label.setBackground(Color.lightGray);
			}
			else
			{
				label.setBackground(Color.white);
			}
			
			
			
						if (column == 4 || column == 6 || column == 8 || column == 10)
			{
				label.setFont(new Font("Arial", Font.BOLD, 12));
				
				 	if (!(zeilen.contains(String.valueOf(row) + String.valueOf(column))))		
				 	{
				 	String w = value.toString();
					StringBuffer wBuffer = new StringBuffer(w);
					int pos;
					while ((pos = wBuffer.indexOf(".")) != -1)
					{
						wBuffer.deleteCharAt(pos);
					}
					int kPos = wBuffer.indexOf(",");
					wBuffer.setCharAt(kPos, '.');
					String umgew = String.valueOf(wBuffer);
					System.out.println("Wert = " + umgew);
					double wert = Double.parseDouble(umgew);
					wert = wert * -1;
					
					//value = (Object)String.valueOf(df2.format(wert));
					label.setText(String.valueOf(df2.format(wert)));
					System.out.println("Wert2 = " + String.valueOf(value));
					zeilen.addElement(String.valueOf(row) + String.valueOf(column));
				 	}
				 	System.out.println(zeilen.size());
				 	
			}
			
		}
		
		return label;
}


}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z TableCellRenderer anfang so richtig? Java Basics - Anfänger-Themen 13
L JTable und TableCellRenderer + selektieren Java Basics - Anfänger-Themen 3
D TableCellRenderer bzw. ColorRenderer Java Basics - Anfänger-Themen 4
B JTable- TableModel und TableCellRenderer Konflikt Java Basics - Anfänger-Themen 4
J Tabellenfelder im TableCellRenderer auslesen Java Basics - Anfänger-Themen 2
J Wie kombiniere ich TableCellRenderer und TableCellEditor? Java Basics - Anfänger-Themen 2
J *JAR-ICON ÄNDERN, WIE?* Java Basics - Anfänger-Themen 2
T Ändern der Breite eines Zeichens Java Basics - Anfänger-Themen 3
B Java Jar Icon Ändern/Umweg? Java Basics - Anfänger-Themen 5
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
W Ändern eines Eingabeparameters einer Methode Java Basics - Anfänger-Themen 9
Luk10 Ändern von Instanzvariablen Java Basics - Anfänger-Themen 2
M Image-Icon Ändern Java Basics - Anfänger-Themen 15
B JList wird nach Ändern weiß Java Basics - Anfänger-Themen 11
V ColumnModel wird nach Ändern des TableModels nicht genutzt Java Basics - Anfänger-Themen 3
M Ändern einer Socket-Eigenscheft aus einem modalen Dialog? Java Basics - Anfänger-Themen 6
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
Z Rückgabe eines Values in umgekehrte richtung Java Basics - Anfänger-Themen 5
tom.j85 Map - Values nicht korrekt ersetzt (Abzählspiel) Java Basics - Anfänger-Themen 13
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
W Map doppelte Values löschen Java Basics - Anfänger-Themen 3
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
T Auf Values einer übergebenen Map zugreifen Java Basics - Anfänger-Themen 6
ruutaiokwu properties values automatisch escapen ??? Java Basics - Anfänger-Themen 3
K class Enum Methode: values() - finde ich nicht in der API Java Basics - Anfänger-Themen 2
S Values in HashMap überschrieben? Java Basics - Anfänger-Themen 6
I Verwendung von Constant Field Values Java Basics - Anfänger-Themen 4
G HashMap durchlaufen und alle keys mit values ausgeben Java Basics - Anfänger-Themen 4
P BufferedReader / FileReader Key und Values Java Basics - Anfänger-Themen 7
P HashMap mehrere values auslesen. Java Basics - Anfänger-Themen 8
M Html Parsen / Values von Hidden Fields auslesen Java Basics - Anfänger-Themen 10
G ArrayList<Map.Entry.> nach den Values sortieren? Java Basics - Anfänger-Themen 8
J Addition von double values fehlerhaft? Java Basics - Anfänger-Themen 5
I Key mit 2 Values speichern - Hashmap? Java Basics - Anfänger-Themen 3
R Hashtable ohne Values Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben