Verweis auf Objekt

Status
Nicht offen für weitere Antworten.

Felix

Bekanntes Mitglied
Hi,

ich hab ein Koordinatensystem geschrieben, in dem ich per addVektor(Vektor v) Vektoren (auch selbst geschriebene Klasse) hinzufügen kann. Diese werden dann in eine ArrayList abgelegt und bei jedem Aufruf von paint() gezeichnet. Die Vektoren werden davor ein einer anderen Klasse, die sich auch um die Registrierung der Vektoren im Koordinatensystem kümmert, manipuliert.
Mein Problem ist, dass bei 3 der 6 Vektoren die Änderung auch gezeichnet werden, und bei den anderen drei, scheint das Koordinatensystem nicht auf die Vektoren der manipulierenden Klasse zuzugreifen, sondern sie sich "rüber zu kopieren", so dass ich sie fröhlich in der Klasse bearbeiten kann, aber die Änderung nicht angezeigt wird...
Jetzt meine Frage:
Gibt es so eine Art "Link", der der Klasse Koordinatensystem sagt, dass es sich das Objekt mit der manipulierenden Klasse teilen muss?

Gruß
der Felix
 
Zeig mal Code. Der Fehler liegt irgendwo bei dir. Referenzen referenzieren (wie der Name schon sagt) nur.
 
Code:
public class VektorBox {

[...]

	public VektorBox(Koordinatensystem ko) {
		koordinatensystem = ko;

		/*
		 * Vektoren e1, e2, e3 errechnen
		 */
		generateE();

		/*
		 * Vektoren einrichten
		 */
		b0.setColor(java.awt.Color.red);
		b1.setColor(java.awt.Color.red);
		b2.setColor(java.awt.Color.red);

		/*
		 * Vektoren registrieren
		 */
		koordinatensystem.addVektor(b0);
		koordinatensystem.addVektor(b1);
		koordinatensystem.addVektor(b2);
		koordinatensystem.addVektor(e1);
		koordinatensystem.addVektor(e2);
		koordinatensystem.addVektor(e3);
	}

	/*
	 * B Vektoren entlang Achsen verschieben
	 */
	public void slide(int achse, int wert) {
		int[] i = b0.getValue();
		i[achse] = i[achse] + wert;
		b0.setValue(i[0], i[1], i[2]);
		i = b1.getValue();
		i[achse] = i[achse] + wert;
		b1.setValue(i[0], i[1], i[2]);
		i = b2.getValue();
		i[achse] = i[achse] + wert;
		b2.setValue(i[0], i[1], i[2]);

		generateE();
	}

	/*
	 * Vektoren e1, e2, e3 errechnen
	 */
	private void generateE() {
		int[] b0value = b0.getValue();

		// DEBUG
		System.out.println("b0 Value: " + b0value[0] + " " + b0value[1] + " "
				+ b0value[2]);

		e1 = b1.summateVektor(b0.multiplySkalar(-1.0));
		e1.setStart(b0value[0], b0value[1], b0value[2]);
		e1.setName("e1");
		e2 = b2.summateVektor(b0.multiplySkalar(-1.0));
		e2.setStart(b0value[0], b0value[1], b0value[2]);
		e2.setName("e2");
		e3 = e1.vektorProduct(e2);
		e3.normalize();
		e3.setName("e3");
		e3.setStart(b0value[0], b0value[1], b0value[2]);

		// DEBUG
		int [] value = e1.getValue();
		int [] start = e1.getStart();
		System.out.println("berechne e1: " + value[0] + " " + value[1] + " "
				+ value[2] + " ab: " + start[0] + " " + start[1] + " "
				+ start[2]);
	}
}

und:

Code:
public class Koordinatensystem extends JPanel {

[...]

@Override
	public void paint(Graphics g) {

[...]

for (int i = 0; i < vektors.size(); i++) {
			paintVektor(g, (Vektor) vektors.get(i));
		}
	}

	private void paintVektor(Graphics g, Vektor v) {
		int[] start = v.getStart();
		int[] value = v.getValue();

		// DEBUG
		System.out.println("Zeichne " + v.getName() + ": " + value[0] + " "
				+ value[1] + " " + value[2] + " ab: " + start[0] + " "
				+ start[1] + " " + start[2]);

		g.setColor(v.getColor());

		g.drawLine(nullx + measure * start[1]
				- (int) (measure * start[0] * SQRT05), nully - measure
				* start[2] + (int) (measure * start[0] * SQRT05), nullx
				+ measure * (start[1] + value[1])
				- (int) (measure * (start[0] + value[0]) * SQRT05), nully
				- measure * (start[2] + value[2])
				+ (int) (measure * (start[0] + value[0]) * SQRT05));
	}
}

Das ist eigl der Code der sich damit beschäftigt...
 
Daraus lässt sich nichts erkennen. Was macht zB addVektor? Bist du dir sicher das du immer bestehende Objekte manipulierst anstatt sie neu zu erzeugen?
 
vermutlich (hab mir den code nicht angesehen)

a = new A();
vektor.add(a);
a = new A();

das a im vector wäre jetzt ein anderes...

versuch ob, du das bestehende objekt verändern kannst
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben