# Klassenvariable wird nicht überschrieben.



## Moch (6. Dez 2011)

Hallo,
Im Zuge unserer Gruppenprojekts haben wir ein Problem mit einer Variable, die nicht, wie gewünscht überschrieben wird.
Genutzt wird (falls es jemand kennt), das Framework SalesPoint
Da die Klassen untereinander große Abhängigkeiten besitzen und wir die Klassen des Framesworks selbst nicht einsehen können, poste ich hier nur ein vereinfachtes Beispiel.


```
public class ContentCreatorPersonenAnzeigen {

//Ist die Variable, die geändert werden soll;
int changeVal;

JTable person;

   @override
   protected void createFormSheetContent(Formsheet fs){

		person.setSelectionMode(ListSelectionModel.SINGLE_SELECTION );	
		person.addMouseListener(new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent e) {
				changeVal = person.getSelectedRow();
                                System.out.println(changeVal); // Der Wert ist immer korrekt;
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		});


   }

}
```

Ich hoffe, dass das Beispiel halbwegs das Problem zeigt:

*Folgende Fakten dazu:*
- der JTable funktioniert einwandfrei und wird korrekt ausgegeben;
- die variable changeVar wird in der Konsole als korrekt ausgegeben (über System.out.println(changeVal)...egal an welcher Stelle.
- wir können keinen Konstruktor schreiben (Framework)
- an den offenbar irgendwo vorhandenen Konstruktor kommen wir nicht rein(Framework)

*Fehler der Auftritt:*
- changeVar behällt den anfangs deklarierten wert. Im hier genannten Beispiel wäre changeVar = 0;
Initialisieren wir es als irgendetwas anderes, so behällt changeVar leider seinen vorgegebenen Wert und wird nicht korrekt überschrieben.

Das führt dazu, dass immer die selbe Person in einer Liste ausgewählt wird (nämlich deren Index vorher initialisert wurde). Die Auswahl der Person selbst und die nächste GUI, die wir im Zuge dessen nutzen, ist Framework-intern, funktioniert aber, für den Index (der leider nicht überschrieben wird)

*Unsere Ideen, woran es liegen könnte*
- Überschreiben der Klassenvariablen funktioniert in dieser internen Methode nicht (haben es mit einem Setter versucht, aber es hat nichts an der Var geändert... Werte im Setter waren korrekt)
Setter war von der Form

```
public void setChangeVar(int changeVar){
this.changeVar = changeVar;
}
```

- irgendwo wird eine neue Instanz von ContentCreatorPersonAnzeigen erzeugt ... dies geschieht aber nicht in den von uns geschriebenen Klassen und wir wissen auch nicht, wie wir das nachprüfen oder umgehen könnten;


Wir bitte Euch da um Hilfe. Wäre echt klasse, wenn wir da einen entscheidenden Gedankenanstoß bekommen.

LG
Moch


----------



## jgh (6. Dez 2011)

Imho liegt das Problem nicht in eurer Klasse 
	
	
	
	





```
ContentCreatorPersonenAnzeigen
```
, sondern im Framework selbst. Wenn die Variable 
	
	
	
	





```
changeVal
```
den korrekten Wert per 
	
	
	
	





```
System.out.println()
```
 liefert, dann sollte es richtig sein.

Eine Möglichkeit wäre, dass bei einer Änderung der GUI sich das Framework eine neue Instanz von 
	
	
	
	





```
ContentCreatorPersonenAnzeigen
```
holt. Das würde erklären, warum immer der Defaultwert angezeigt wird. Aber das ist Kaffeesatzleserei.

EDIT:
Habe erst jetzt die Überschrift beachtet. Deine Variable 
	
	
	
	





```
changeVal
```
 ist natürlich keine Klassenvariable, sondern eine Instanzvariable. Von Klassenvariablen spricht man dann, wenn die Variable an die Klasse gebunden ist und somit für alle Instanzen der Klasse den gleichen Wert besitzt. Dieses wird in Java durch das Wort [c]static[/c] erreicht.


----------



## Moch (6. Dez 2011)

Ah, vielen Dank für die Informationen. Das mit dem Static wusste ich bisher nicht =)

Wir habe das Problem mittlerweile teilweise umgangen, indem wir eine eigene Klasse erstellt haben, die nur diesen einen Integer enthällt. Das funktioniert auch, aber nur bedingt:

Wenn wir jetzt eine Liste von Personen haben

- Person A
- Person B
- Person C

Wählt man Person A, so wird diese korrekt angezeigt; Wählt man danach Person B/C, dann wird wieder A angezeigt, es sei denn, man klickt zwei Mal auf Person B/C.
Die Variable der anderen Klasse sollte aber JEDES Mal geändert werden, da die entsprechende Methode auch jedes Mal aufgerufen wird und die richtigen Werte auch in der Konsole ausgegeben werden.
Ich frage mich, ob das nicht ein Problem von JTable ist?

Grüße und Danke

PS: neuer Quellcode-Ausschnitt folgt gleich in Edit:


```
@Override
            public void mouseClicked(MouseEvent e) {
                changeVal = person.getSelectedRow();
                System.out.println(changeVal); // Der Wert ist immer korrekt;
                AndereKlasse.var = changeVal; //zum Testen war hier alles public. Passiert aber nur jedes 2. Mal
            }
```


----------



## Madlip (7. Dez 2011)

das kommt mir echt alles spanisch vor.

Versuch mal in der anderen Klasse deine changeVar in eine static Variable mehr zu machen.

Da die sich ja immer mit ändern soll, passt das. 

Damit umgehst du auch das "eventuelle" Problem das von der Var irgendwie eine Kopie erstellt werden könnte.

Gruß


----------



## GUI-Programmer (7. Dez 2011)

Ich glaube schon in Zeile 4 
	
	
	
	





```
int changeVal;
```
 liegt der Fehler. Denn wenn deine Klasse von einer anderen erbt (auch wenn bei dir kein extends steht), überschreibt man die Variablen *nicht*, indem man sie neu erstellt, sondern einfach einen anderen Wert zuweist. D.h. kommentier doch einfach mal Zeile 4 aus.

Beispiel:

```
import java.awt.Point;

public class Test4 extends Point {
	public void doIt() {
		System.out.println("X: "+x+"  Y: "+y);
	}
	
	public void change() {
		x = 50;
		y = 80;
	}
	
	public static void main(String[] args) {
		Test4 test = new Test4();
		test.x = 1;
		test.y = 2;
		System.out.println(test.getLocation());
		test.doIt();
		test.change();
		System.out.println(test.getLocation());
		test.doIt();
	}
}
```


----------



## Moch (8. Dez 2011)

Danke für eure Antworten;
Nee, die Variable wird in dieser Klasse erstmals eingeführt und gilt auch nur dort. Kommentieren wir es aus, dann wird die Variable unten nicht mehr anerkannt.

Das Problem wurde aber von einem anderen Teil der Projektgruppe beseitigt. Was genau die Lösung jetzt war, weiß ich nicht und mir verständlich erklären, wollte das auch keiner. Leider verfüge ich derzeit auch nicht über den gültigen, aktuellen Quelltext;

Trotzdem vielen Dank für eure Hilfe.

Bye


----------

