Java BlueJ zwei int gleichzeitig ausführen.

Nordmark

Lieutenant
Registriert
Nov. 2007
Beiträge
898
Moin,

mich nach meinem ersten fertigen Master jetzt ein bisschen weiter zu fassen und mich mit beispielsweise mit Programmierung zu beschäftigen.
Belege dazu einen freiwilligen Kurs an meiner Uni der sich derzeit mit Java beschäftigt. Genutzt wird dazu allerdings BlueJ um uns die Sache für den Anfang zu vereinfachen.
Eigentlich komme ich auch ganz gut klar, nur habe ich eine Frage:

Code:
/**
 * Eine Bmpel besteht aus drei Lampen in den Farben rot, gelb und gruen.
 * Sie durchlaeuft periodisch vier Phasen: gruen, gelb, rot, rot/gelb.
 * In den ersten drei Phasen leuchtet also nur jeweils eine Lampe,
 * waehrend in der vierten Phase zwei Lampen gleichzeitig leuchten.
 * Der Zustand der einzelnen Lampen kann abgefragt werden,
 * und die Bmpel kann in die naechste Phase geschaltet werden.
 * Die Schaltung geschieht explizit durch einen Methodenaufruf
 * (und nicht etwa durch einen automatischen Timer).
 * 
 */
class Bmpel
{
    private int _phase;

    /**
     * Initialisiert eine neue Bmpel auf die erste Phase (gruen).
     */
    public Bmpel()
    {
        _phase = 0;
    }

    /**
     * Schaltet die Bmpel in die naechste Phase (gruen -> gelb -> rot -> rot/gelb -> gruen).
     */
    public void schalteWeiter()
    {
        _phase = (_phase + 1) % 4;
        _phase = (_phase + 2) % 4;
        _phase = (_phase + 2) % 4;
    }

    /**
     * Gibt an, ob die rote Lampe leuchtet.
     */
    public boolean leuchtetRot()
    {
        return _phase == 2;
    }

    /**
     * Gibt an, ob die gelbe Lampe leuchtet.
     */
    public boolean leuchtetGelb()
    {
        return _phase == 1;
    }

    /**
     * Gibt an, ob die gruene Lampe leuchtet.
     */
    public boolean leuchtetGruen()
    {
        return _phase == 0;
    }

}

Soweit ich das jetzt geschrieben habe, (habe leider aus gesundheitlichen Gründen die letzte Sitzung verpasst). Schaltet die Ampel Grün -> Gelb -> Rot -> Grün usw.
Mir fehlt die Stufe in er die Ampel Rot/Gelb leuchtet.
Wären die vorgaben der Phasen per Boolean bestimmt wäre es ja auch einfach machbar aber (wahrscheinlich ist die Lösung trivial) bekomme ich es nicht zu Stande auf Rot/Gelb gleichzeitig zu programmieren.
Dazu müsste ich, ohne weitere Methoden zu definieren, es schaffen die int Werte Gelb (1) und Rot (2) zu vereinen, selbstverständlich ohne boolsche Werte zu nutzen, da sonst der Kompiler streikt.

Also es ist wahrscheinlich wirklich einfach aber kann mir jemand erklären wie ich zwei int Werte dazu bringen kann gleichzeitig aktiv zu sein?

Vielen Dank im Vorraus
 
du brauchst laut aufgabenstellung aber eine vierte methode, denn die umschaltung geschieht über methoden.

wenn du zwei werte gleichzeitig aktiv haben willst, musst du natürlich auch zwei bool-, int-werte oder was auch immer anlegen.
 
Code:
/**
 * Eine Bmpel besteht aus drei Lampen in den Farben rot, gelb und gruen. Sie durchlaeuft periodisch vier Phasen: gruen, gelb, rot, rot/gelb. In den ersten drei Phasen leuchtet also nur jeweils eine
 * Lampe, waehrend in der vierten Phase zwei Lampen gleichzeitig leuchten. Der Zustand der einzelnen Lampen kann abgefragt werden, und die Bmpel kann in die naechste Phase geschaltet werden. Die
 * Schaltung geschieht explizit durch einen Methodenaufruf (und nicht etwa durch einen automatischen Timer).
 * 
 */
class Bmpel {
	private int _phase;

	/**
	 * Initialisiert eine neue Bmpel auf die erste Phase (gruen).
	 */
	public Bmpel() {
		_phase = 0;
	}

	/**
	 * Schaltet die Bmpel in die naechste Phase (gruen -> gelb -> rot -> rot/gelb -> gruen).
	 */
	public void schalteWeiter() {
		_phase = (_phase + 1) % 4; // <--------
	}	

	/**
	 * Gibt an, ob die rote Lampe leuchtet.
	 */
	public boolean leuchtetRot() {
		return _phase == 2 || _phase == 3; // <--------
	}

	/**
	 * Gibt an, ob die gelbe Lampe leuchtet.
	 */
	public boolean leuchtetGelb() {
		return _phase == 1 || _phase == 3; // <--------
	}

	/**
	 * Gibt an, ob die gruene Lampe leuchtet.
	 */
	public boolean leuchtetGruen() {
		return _phase == 0;
	}

	// <-------- zum testen
	public String toString() {
		return "Phase='"+ _phase + "', lechtetRot='" + leuchtetRot() + "', leuchtetGelb='" + leuchtetGelb() + "', leuchtetGruen='" + leuchtetGruen() + "'";
	}
	
	public static void main(String[] args) {
		Bmpel amp = new Bmpel();
		
		for (int i = 0; i < 10; i++) {
			System.out.println(amp);
			amp.schalteWeiter();
		}
	}
}
 
Dabei war ich mir eben unsicher, da alle Methoden vorgegeben waren und ich dachte es entspräche eben der Aufgabe ohne weitere Methode das Ziel zu erreichen.
Ne Idee zu der Methode?
Einfach wär ja:

Code:
 /**
     * Gibt an, ob die gelbe und rote Lampe leuchtet.
     */
    public boolean leuchtetGelbRot()
    {
        return _phase == 3;
    }

oder vergesse ich da was? Funktioniert so auch nicht.
Eine neue Methode bewirkt nichts in der dazu gehörigen GUI. Es bleibt bei Grün -> Gelb -> Rot -> Grün, egal was ich mache? Ich glaub ich steh da voll aufm Schlauch...
Ergänzung ()

@NiNock: So funktioniert es einwandfrei. Hast du noch die Geduld mir deine Weisheit näher zu bringen? Bzw. Was war mein Fehler, wie bist du genau vorgegangen? Bzw. einfach durch || alles geschaltet. Spart auch die komplette Code Abänderung. Bin halt noch Beginner auf dem Gebiet aber ne formale Erklärung wäre absolut ausgezeichnet wobei ich mir das meiste denken bzw. herleiten kann.
Du bist sicher auch deutlich weiter als ich, denn mit deiner Formatierung arbeiten wir (noch) nicht.
 
Zuletzt bearbeitet:
Ich habe ja im Prinzip nur 3 Änderungen gemacht. DIe sind immer mit "//<--------" gekennzeichnet.

In der Methode schalteWeiter() solltest du eben nur einmal weiterschalten und nicht 5 mal.

Die Methoden für das Leuchten der einzelnen Lampen sollen zurückgeben ob eine Lampe leuchtet oder eben nicht. Der von mir verwendete Ausdruck "a || b" bedeutet, dass er true zurückgibt, wenn entweder a oder b wahr ist. Man schaut also einfach nur in welchen möglichen Objektzuständen die Lampe leuchten soll und beschreibt das Ergebniss als logischen Ausdruck. Mir ist nicht ganz klar, was dir dabei genau unklar ist.

Vielleicht hilft es wenn ich anmerke, dass du in dem Programm ja nicht 2 Lampen gleichzeitig anmachst. Die Steuerung der Lampen ist in einer anderen Klasse untergebracht. Warscheinlich fragt die Implementierung einfachh alle 3 Methoden ab und stellt das Ergebnis grafisch dar. Für die von Dir gezeigte Klasse bedeutet das eben, dass du nur die 3 Methoden so anpassen musst, sodass gilt:

phase=0 -> grün= true, rest=false
phase=1 -> gelb= true, rest=false
phase=2 -> rot= true, rest=false
phase=3 -> gelb= true, rot= true, grün=false

Eventuell denkst du einfach etwas zu kompliziert.
 
Zuletzt bearbeitet:
Hast ne PN deswegen. Danke auf jedenfall schon mal. Das mit den || ist mir noch klar und den Modulo hab ich auch verstanden, deswegen funktioniert _phase == 3 auch nicht, aber den letzte Teil blicke ich gar nicht.
Deine eigene Methode für alles?

Ja, ich denke in solchen Bereichen immer viel zu kompliziert leider.
Aber ich meine was du am Ende als Test hast, die Klasse funktioniert ja auch ohne diesen Teil.
 
Zuletzt bearbeitet:
Zurück
Oben