boolean im Bean abfragen

Status
Nicht offen für weitere Antworten.

rhöner

Mitglied
Ich habe ein Bean in dem ich in einer IF Anweisung einen boolean Wert abfragen möchte.

Bean:
Code:
public void onNaechsterDatensatz(ActionEvent event) {

      if (aenderung == true) 
	 System.out.print("Soll erst gespeichert werden?"); 
      ...
}

Die andere Datei in der das boolean steht:
Code:
public class Schaden {

      private boolean aenderung = false;

}

Das ganze wird auf ein Formular angewendet. Wenn man nun also in einem Feld einen Wert ändert und möchte zum nächsten Datensatz weitergehen, soll erst gefragt werden, ob man den geänderten Datensatz speichern möchte.
In den SET Methoden habe ich entsprechend "aenderung = true;" eingefügt.

Wie sage ich in der IF Anweisung im Bean, das er aenderung aus der Klasse Schaden abfragen soll? Ich komm nicht auf die Syntax.
 
Hast du denn eine getter/setter-Methode in deiner Klasse "Schaden" für das Attribut aenderung?

Des weiteren brauchst du eine Instanzvariable von Schaden in deiner Bean.

(Vorausgesetzt ich habe dein Problem richtig verstanden.)
 
Die getter/setter-Methoden hatte ich bereits eingestellt. Hatte ich nur vergessen hier zu posten.

Code:
public boolean getAenderung() {
		return aenderung;
	}

public void setAenderung(boolean aenderung) {
		aenderung= true;
		this.aenderung = aenderung;
	}
 
Hast du denn auch die getter/setter-Methoden für das Attribut "aenderung" (auf das du schließlich zugreifen willst)? Aus deiner Antwort geht das nicht für mich hervor.
 
Irgendwie bin ich heut völlig neben der Spur. Im Programm heißen die Methoden Objecthaschanged. Hab einfach blind kopiert. Zum besseren Verständnis hab ich es hier umbenannt.
 
Passiert schon mal 😉. Hast du denn eine Instanzvariable vom Typ "Schaden" in deiner Bean? Wenn ja:

Code:
private Schaden schaden = new Schaden();

//Die Abfrage der Änderung

if (schaden.getAenderung()
{
//Mache was
}
 
rhöner hat gesagt.:
Die getter/setter-Methoden hatte ich bereits eingestellt. Hatte ich nur vergessen hier zu posten.

Code:
public void setAenderung(boolean aenderung) {
		aenderung= true;
		this.aenderung = aenderung;
	}

aenderung = true zu setzen und dann den übergebenen boolean-Wert zu setzen scheint mir wenig sinnvoll zu sein.
 
Anonymous hat gesagt.:
aenderung = true zu setzen und dann den übergebenen boolean-Wert zu setzen scheint mir wenig sinnvoll zu sein.
Wieso den übergebenen boolean-Wert zu setzen? Den vergleiche ich doch in der IF Anweisung mit '=='.
 
Setter-Methoden "setzen" den Wert einer Variable nur . Sie machen nichts anders:

Code:
public void setAenderung(boolean aenderung) { 
      this.aenderung = aenderung; 
   }
 
Hast du das Problem gelöst, wenn ja wie? 😉

Ansonsten sag woran es noch hapert.
 
sieht jetzt so aus bei mir:

Code:
public class Schaden {

    public static boolean aenderung = false;

    ...

    public boolean getAenderung() {
		return aenderung;
 	}



    public void setAenderung(boolean aenderung) {
		aenderung = true;
		this.aenderung = aenderung;
   	}
}

Code:
public void onNaechsterDatensatz(ActionEvent event) {

		...

		if (Schaden.aenderung == true) {
			System.out.println("Soll erst gespeichert werden?"); 
...
		}
}

Das Problem ist nur, wenn ich auf die Schaltfläche "nächster" gehe, kommt immer diese Meldung. Die soll ja eigentlich nur kommen, wenn was geändert wurde.
 
Es wurde schon geschrieben, aber nochmal:
Das hier
Code:
    public void setAenderung(boolean aenderung) {
      aenderung = true;
      this.aenderung = aenderung;
      }
ist eigenlich Unsinn; das ist das gleiche wie
Code:
    public void setAenderung(boolean ganzEgalWasHierKommtDerWertWirdIgnoriert) {
      this.aenderung = true; //--- voellig unabhaengig vom uebergebenen Parameter
      }

Der Setter muss aussehen:
Code:
    public void setAenderung(boolean aenderung) {
      this.aenderung = aenderung;
      }

(Um solche Fehler auch in weniger trivialen Fällen zu vermeiden, sollte man sich angewöhnen, die Parameter solcher Methode final zu deklarieren, dann würde die überflüssige Zuweisung schon vom Compiler zurückgewiesen werden)
 
Meinen Setter habe ich jetzt entsprechend geändert, aber die Meldung erscheint trotzdem jedesmal beim Klick auf die Schaltfläche, auch ohne Änderungen.
Ich habe sogar in der IF Anweisung die Variable wieder auf FALSE gesetzt.
 
Setzt Du aenderung irgendwo direkt auf "true"? Oder gehst Du immer über den Setter?

Wenn ich Dich richtig verstanden habe, dann müsste aenderung immer dann auch "true" gesetzt werden, wenn sich eine andere Eigenschaft ändert. Insofern müssten dann alle anderen Setter (aber eben nicht setAenderung) in etwa so aussehen:
Code:
private String eineEigenschaft;

...

public String getEineEigenschaft() {
  return eineEigenschaft;
}

public void setEineEigenschaft( final String eineEigenschaft) {
  this.eineEigenschaft = eineEigenschaft;
  setAenderung( true);
}

...
 
Also: aenderung wird mit false initialisiert, nur in den Settern der anderen Eigenschaften auf true gesetzt und ist trotzdem true, auch wenn nichts geändert wurde? Dann hilft nur ein Debugger - oder in diesem Fall vielleicht auch "poor man's debugging" (das setzt aber voraus, dass aenderung niemals ausserhalb des Setters direkt zugewiesen wird):

Code:
public void setAenderung( final boolean aenderung) {

  if ( aenderung) {
    new Exception(
        getClass.getName() + 
        ".aenderung: " + this.aenderung + " ->  " + aenderung
      ).printStackTrace( System.out);
  }
  this.aenderung = aenderung;
}
 
Also die Sache oben ist soweit geklärt. Jetzt hab ich aber ein anderes bzw. weiteres Problem:

Code:
public class Schaden {
     ...
     public static boolean objecthaschanged = false;
     ...

rufe ich folgendermaßen auf:

Code:
public class SchadenBean extends GccApplicationBean implements GccApplicationInterface {
     ...
     public void onOeffneNaechstenSchaden(final ActionEvent event) {
          if (Schaden.objecthaschanged == true) {
          ...

das funktioniert ohne Probleme. Aber mein "Master" will, das ich mit "private boolean objecthaschanged = false" arbeite. Wie muß ich das dann im SchadenBean aufrufen? Hab schon die Vorschläge von Eclipse angeklickt und entsprechend den Code geändert, aber da geht nix.
 
Wenn das Member in der Klasse Schaden private ist, dann kann man es auch der Klasse SchadenBean nicht aufrufen. In diesem Fall brauchst Du eine Zugriffsmethode in der Klasse Schaden
Code:
public static boolean hasObjectChanged(() {
  return objecthaschanged;
}

In SchadenBean kannst Du dann schreiben:
Code:
public class SchadenBean extends GccApplicationBean implements GccApplicationInterface {
     ...
     public void onOeffneNaechstenSchaden(final ActionEvent event) {
          if (Schaden.hasObjectChanged()) {  //--- das == true kann man sich sparen; die Methode liefert ja bereits einen Boole'schen Wert

Ich vermute allerdings, dass das alles zu kurz gesprungen ist: kann es denn wirklich immer nur einen einzigen Schaden geben? Dann geht das so. Kann es aber mehrere Schaden-Instanzen geben, dann dürfen das Member objecthaschanged und die Methode hasObjectChanged() natürlich nicht static sein. Und dann brauchst Du dort, wo Du auf den Zusatnd zugreifen wills (also in SchadenBean) auch eine Referenz auf das jeweilige Schaden-Objekt.
 
Also quasi die Getter-Methode abfragen. Danke! Mein Problem war, das ich das zwar auf die Getter-Methode geändert hatte, ich aber die Klammern bei der Abfrage vergessen hab.

Merci!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben