Klassenvariable wird nicht überschrieben.

Moch

Bekanntes Mitglied
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.

Java:
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
Java:
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
 
Imho liegt das Problem nicht in eurer Klasse
Code:
ContentCreatorPersonenAnzeigen
, sondern im Framework selbst. Wenn die Variable
Code:
changeVal
den korrekten Wert per
Code:
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
Code:
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
Code:
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.
 
Zuletzt bearbeitet:
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:

Java:
            @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
            }
 
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ß
 
Ich glaube schon in Zeile 4
Code:
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:
Java:
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();
	}
}
 
Zuletzt bearbeitet:
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
 

Neue Themen


Zurück
Oben