Ampelschaltung mit if-Befehl

Guten Abend zusammen,

wie man dem Titel schon entnehmen kann, geht es um das bekannte Thema der Ampelschaltung.

Ich habe zwar schon so einiges hier aus dem Forum mir diesbezüglich angeschaut, doch kam ich mit den jeweiligen Kommentaren in der Struktur meines Programmes nicht weiter.
Mein Problem ist, dass alle Ampelphasen angezeigt werden bis auf eine. Dabei hängt das davon ab, in welcher Reihenfolge die if-Befehle stehen. Je nach dem fehlt entweder einfach rot oder wie hier im dargestellten Abschnitt gelb.
Das hängt damit zusammen, dass das Programm zwar am Anfang richtig schaltet, aber später wieder anders, weil sich die Zustände halt verändert haben.

Dabei habe ich mich unter anderem auch schon an if-Verschachtelung probiert und an diesem Prinzip ( https://www.java-forum.org/thema/ampelschaltung-mit-if-anweisung.170408/ ) orientiert, doch nach dieser Ordnung ging noch vieles mehr nicht.

Ich hoffe, dass man mir zeitnah weiterhelfen kann und bedanke mich im Voraus.

Mit freundlichen Grüßen

Viktor A. Kaiser

Java:
if (panelGelb.getBackground() == Color.BLACK&&panelGruen.getBackground() == Color.GREEN&&panelRot.getBackground() == Color.BLACK) {
    panelGruen.setBackground(Color.black);
    panelRot.setBackground(Color.black);
    panelGelb.setBackground(Color.yellow);
    }
        
if(panelRot.getBackground() == Color.RED&&panelGelb.getBackground() == Color.YELLOW){     
    panelGruen.setBackground(Color.green);
    panelRot.setBackground(Color.black);
    panelGelb.setBackground(Color.black);
    }
          
if (panelRot.getBackground() == Color.RED&&panelGelb.getBackground() == Color.BLACK) {
    panelRot.setBackground(Color.red);
    panelGruen.setBackground(Color.black);
    panelGelb.setBackground(Color.yellow);
    }
          
if (panelGelb.getBackground() == Color.YELLOW&&panelGruen.getBackground() == Color.BLACK&&panelRot.getBackground() == Color.BLACK) {
    panelGruen.setBackground(Color.black);
    panelRot.setBackground(Color.red);
    panelGelb.setBackground(Color.black);
    }         

if(panelGelb.getBackground() == Color.BLACK&&panelRot.getBackground() == Color.BLACK&&panelGruen.getBackground() == Color.BLACK){    //&& = und
    panelRot.setBackground(Color.red);
    }
 
Beste Antwort
Wenn Du einfach bei dem Code, den Du oben gezeigt hast, vor jedes if (außer dem ersten natürlich!) ein else packst, dann sollte es schon funktionieren.

Generell solltest Du den Code aber leserlicher schreiben. Bei den && solltest Du mindestens ein Leerzeichen davor und danach einfügen. Aber es empfiehlt sich bei so langen Zeilen, das auch einfach aufzuteilen auf mehrere Zeilen. Dann sieht es z.B. so aus:
Java:
        if (panelGelb.getBackground() == Color.BLACK
                && panelGruen.getBackground() == Color.GREEN
                && panelRot.getBackground() == Color.BLACK) {
            panelGruen.setBackground(Color.black);
            panelRot.setBackground(Color.black);
            panelGelb.setBackground(Color.yellow)...
Nein, noch nicht.
An sich soll die Aufgabe auch nach so einem ähnlichen Prinzip erstellt werden. Als Tipp nannte man mir zwar die Verkettung von if-Abfragen,
doch kann man meiner Meinung nach das doch auch nach so einer Vorgehensweise funktionieren, oder? Es ist ja zumindest nur eine einzige Ampel-Phase, die nicht funktioniert...
 
Y

yfons123

Gast
ich würde dir raten system.out.printlns einzufügen was im moment passiert
ob du das if überhuapt betrittst
und ob du das if sofort wieder überschreibst
 

KonradN

Super-Moderator
Mitarbeiter
Dein Problem hier ist vermutlich schlicht und einfach, dass Du alle ifs durchläufst. Damit wird in einem Zyklus mehrfach geschaltet.

Es gibt zwei Möglichkeiten, die hier in Frage kommen:
1. Du baust eine if ... else if .... else if .... else if .... Konstruktion, d.h. Du baust else mit ein.
2. Wenn es in einer Klasse ist, dann kannst Du nach dem Umschalten mit return zurück gehen. Ans Ende jedes Blockes kommt dann also ein return.

Das sind einfache Lösungen. Generell bietet es sich an, das auch alles etwas umzuschreiben. Das ist aber abhängig davon, was Du so schon alles hast. Hier könnte man z.B. jede Phase als Enum abbilden und dann hast Du einfache Übergänge (z.B. mit einem switch Statement oder als Status innerhalb des Enums). Dazu muss man aber Enums und Klassen etwas besser kennen, denn die Enums hätten dann auch jeweils weitere Werte intern gespeichert.
 
Also, was, wie passiert, das weiß ich bereits.
Wenn es grün ist, wird nicht auf gelb, sondern auf rot direkt umgeschaltet. Grund dafür ist, dass zwar der folgende Befehl zunächst richtigerweise auf gelb umschaltet,

Java:
if (panelGelb.getBackground() == Color.BLACK&&panelGruen.getBackground() == Color.GREEN&&panelRot.getBackground() == Color.BLACK) {
    panelGruen.setBackground(Color.black);
    panelRot.setBackground(Color.black);
    panelGelb.setBackground(Color.yellow);
    }

aber die danach kommende if-Abfrage auf rot umschaltet, weil inzwischen im Programm mittlerweile ja auf gelb umgestellt worden ist.

Code:
 if (panelGelb.getBackground() == Color.YELLOW&&panelGruen.getBackground() == Color.BLACK&&panelRot.getBackground() == Color.BLACK) {
    panelGruen.setBackground(Color.black);
    panelRot.setBackground(Color.red);
    panelGelb.setBackground(Color.black);
    }

Wenn ich nun allerdings das anders sortiere, dann ist es im nächsten Schritt eine andere Ampelphase nicht schaltet möchte, z.B. rot-gelb.

Ergänzung zu KonradN:

Klassen sind noch nicht Teil meiner Kenntnisse, das schließt Enum ein. Darüber habe ich in Folge meiner Recherchen tatsächlich auch schon einiges gelesen, doch sollte das Programm besser auf den bereits vermittelten Bildungsstand basieren. Dementsprechend wären if....else if, etc. schon besser.
Eine solche ähnliche Variante habe ich tatsächlich auch schon ausprobiert, doch ging dann nur noch rot und rot-gelb. Ich suche gerade mal dieses Programm nochmal raus und stelle es gleich hier rein.

Zweite Ergänzung mit dem Programm:

Java:
if (panelRot.getBackground() == Color.RED) {
    panelGruen.setBackground(Color.black);
    panelRot.setBackground(Color.red);
    }
        
    else if (panelRot.getBackground() == Color.RED&&panelGelb.getBackground() == Color.YELLOW) {
        panelGruen.setBackground(Color.black);
        }
          
    else if (panelGruen.getBackground() == Color.GREEN) {
        panelGruen.setBackground(Color.black);
        panelRot.setBackground(Color.black);
        panelGelb.setBackground(Color.yellow);
        }
            
    else {
        panelRot.setBackground(Color.red);
        }
 
Zuletzt bearbeitet:
Y

yfons123

Gast
naja deswegen wurde dir bei der aufgaben schaltung zu verkettung geraten

Java:
if(){
   
}else if() {
   
}
// vs
if(){
   
}
if(){
   
}
wo ist denn hier der unterschied
 
Also beim ersten heißt es doch, dass, wenn die eine Bedingung zutrifft, dann mache das folgende, wenn noch das zutrifft - denke ich....
Beim zweiten ist es klassisch, wenn das eine zutrifft, dann mache das und wenn das andere zutrifft, dann mache das.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du einfach bei dem Code, den Du oben gezeigt hast, vor jedes if (außer dem ersten natürlich!) ein else packst, dann sollte es schon funktionieren.

Generell solltest Du den Code aber leserlicher schreiben. Bei den && solltest Du mindestens ein Leerzeichen davor und danach einfügen. Aber es empfiehlt sich bei so langen Zeilen, das auch einfach aufzuteilen auf mehrere Zeilen. Dann sieht es z.B. so aus:
Java:
        if (panelGelb.getBackground() == Color.BLACK
                && panelGruen.getBackground() == Color.GREEN
                && panelRot.getBackground() == Color.BLACK) {
            panelGruen.setBackground(Color.black);
            panelRot.setBackground(Color.black);
            panelGelb.setBackground(Color.yellow);
        }
 
Beste Antwort
Danke, das hat tatsächlich geholfen! Die Ampel funktioniert nun einwandfrei. So nah und doch so fern, wie ich immer so schön sage.
Aber könnten wir diesbezüglich kurz nochmal auf den Hintergrund eingehen, inwiefern diese Verkettung nun funktioniert?
Läuft das nach dem Prinzip ab, das ich in der Nachricht zuvor erwähnte?
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. meinst Du das Richtige, aber Du hast es aus meiner Sicht nicht gut ausgedrückt.

Das mit dem if ist ja ein Wenn ... Dann ...

Mit dem Else wird das zu einem if / else und wenn man es ausdrücken würde, dann wäre es ein Wenn ... Dann ... sonst ...

Das if else if ist nichts eigenständiges.

Du hast das:
Java:
if (Bedingung) {
    // ...
} else {
    // ...
}

und nun kommt in den else block ein neues if / else rein:

Java:
if (Bedingung) {
    // ...
} else {
    if (Bedingung2) {
        // ...
    } else {
        // ...
    }
}

Nun kommt ein weiterer Punkt, der wichtig ist: Statt so Blöcken kann man auch genau einen Befehl schreiben, also sowas wie:
Code:
if (Bedingung) doSomething();
else doSomethingElse();

Und damit schauen wir uns das Konstrukt mit dem if else if else noch einmal an: In der ersten else ist nur ein Befehl - dieses if else - also kann man das ohne den Block schreiben:

Java:
if (Bedingung) {
    // Hier haben wir den Block / die {} gelassen
} else if (Bedingung2) {
    // ...
} else {
    // ...
}

Durch das Weglassen der geschweiften Klammern haben wir nicht die immer stärkere Verschachtelung und die damit immer tiefere Einrückung.

Hat dies das Verständnis etwas verbessert und ist das deutlich geworden?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
Lion.King switch-Befehl Java Basics - Anfänger-Themen 6
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
F Terminal Windows per Befehl schließen? Java Basics - Anfänger-Themen 9
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
A Scanner Befehl Java Anfänger Java Basics - Anfänger-Themen 8
K Subklassen mit einzigem Befehl addieren Java Basics - Anfänger-Themen 6
F cmd Befehl ausführen Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
D Input/Output Befehl aus Benutzereingabe herausfiltern Java Basics - Anfänger-Themen 12
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
N Javac -version der Befehl ist entweder falsch geschrieben oder...... Java Basics - Anfänger-Themen 8
O Methoden Runtime.getRuntime().exec(befehl); Java Basics - Anfänger-Themen 6
L Ist an diesem Befehl irgendwas falsch? Java Basics - Anfänger-Themen 2
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
B Copy Paste Befehl Java Basics - Anfänger-Themen 6
O String: Befehl und Wert erkennen. Java Basics - Anfänger-Themen 4
D Erste Schritte Zuul - 2ten Befehl einführen Java Basics - Anfänger-Themen 68
D Erste Schritte Befehl back implementieren Java Basics - Anfänger-Themen 18
elischa unbekannter Befehl zur Compilezeit Java Basics - Anfänger-Themen 22
B Befehl um ein Befehl abzubrechen Java Basics - Anfänger-Themen 2
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
S Befehl current: Java Basics - Anfänger-Themen 3
Silvascus Void Methode einem Stringparameter im syso-Befehl hinzufügen Java Basics - Anfänger-Themen 3
slejden Erste Schritte der Befehl import Java Basics - Anfänger-Themen 2
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
J Problem WIE ohne Goto-Befehl lösbar? Java Basics - Anfänger-Themen 6
N Benötige eine Alternative für einen GOTO Befehl Java Basics - Anfänger-Themen 2
O CMD Befehl javac Java Basics - Anfänger-Themen 3
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
D Klassenmethode: Befehl erkennen, dann int zurückgeben Java Basics - Anfänger-Themen 2
C Desktopiconwechsel ohne Befehl Java Basics - Anfänger-Themen 0
V Schlüsselworte Befehl Ignorieren? Java Basics - Anfänger-Themen 10
B JDK installieren Befehl java funktioniert nicht Java Basics - Anfänger-Themen 15
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
C CMD Befehl + Variable im Java-Code ausführen Java Basics - Anfänger-Themen 8
S Methoden auf befehl ausführen Java Basics - Anfänger-Themen 7
iB0T Eine Art Goto Befehl! Java Basics - Anfänger-Themen 27
H Exit Befehl in eigener Konsole Java Basics - Anfänger-Themen 9
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Schlüsselworte Befehl this Java Basics - Anfänger-Themen 8
E CMD Befehl über Java ausführen? Java Basics - Anfänger-Themen 4
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
D Hilfe zu Java Befehl In.open Java Basics - Anfänger-Themen 2
B Javadoc-Befehl unter Ubuntu Java Basics - Anfänger-Themen 2
I Befehl/Methode "los()" Java Basics - Anfänger-Themen 17
A Befehl gesucht....wie komme ich an Folgendes Objekt? Java Basics - Anfänger-Themen 6
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
S javac Befehl Java Basics - Anfänger-Themen 7
C Befehl zum Verlassen einer Schleife Java Basics - Anfänger-Themen 27
W Befehl ausführen bei Mausklick + gedrückte Strg-Taste Java Basics - Anfänger-Themen 2
B Befehl mit Priorität aufrufen Java Basics - Anfänger-Themen 4
I Befehl wird erst nach dem Ausführen einer Funktion ausgeführt Java Basics - Anfänger-Themen 4
K Problem mit h2 DB Insert Befehl Java Basics - Anfänger-Themen 6
B Befehl für vorselektierten Radiobutton Java Basics - Anfänger-Themen 2
H if-Befehl mit Buttongroup Java Basics - Anfänger-Themen 9
B assert befehl in netbeans Java Basics - Anfänger-Themen 3
M Objekto.Programm. Return-Befehl Java Basics - Anfänger-Themen 4
F Kann String in Befehl wandeln? Java Basics - Anfänger-Themen 12
F Simpler DrawLine - Befehl!? Java Basics - Anfänger-Themen 9
M Befehl zum Einlesen von Benutzereingaben Java Basics - Anfänger-Themen 1
M Befehl zum Fenster schließen? GUI Java Basics - Anfänger-Themen 3
L Do while Befehl verkürzen? Java Basics - Anfänger-Themen 16
-horn- Befehl an CMD übergeben Java Basics - Anfänger-Themen 15
A [Fehlermeldung]Sleep-Befehl Java Basics - Anfänger-Themen 4
B Befehl "javac" wird nicht erkannt Java Basics - Anfänger-Themen 14
S Befehl "javac" funktioniert und Windows 7 nicht? Java Basics - Anfänger-Themen 3
K Terminal Befehl mit Java unter Mac ausführen Java Basics - Anfänger-Themen 18
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
X Befehl import Java Basics - Anfänger-Themen 21
Antoras Explizite Typenumwandlung in einem Befehl Java Basics - Anfänger-Themen 3
A Button einen Befehl zuordnen Java Basics - Anfänger-Themen 7
N suche Datums befehl Java Basics - Anfänger-Themen 8
H Problem mit Tastatur Befehl Java Basics - Anfänger-Themen 11
J Kill befehl Java Basics - Anfänger-Themen 44
G java shell script starten und befehl übergeben Java Basics - Anfänger-Themen 3
Z Ant java -classpath befehl Java Basics - Anfänger-Themen 2
X JOptionPane.showMessageDialog(); - Import Befehl? Java Basics - Anfänger-Themen 4
K Befehl um am Anfang einer Methode zu kommen? Java Basics - Anfänger-Themen 9
G Befehl für Ende bei Switch-Auswahl Java Basics - Anfänger-Themen 11
K fehler mit der Befehl Console Java Basics - Anfänger-Themen 3
H Befehl mit Konstruktoren Java Basics - Anfänger-Themen 2
L Leider klappt bei mir ein Befehl nicht Java Basics - Anfänger-Themen 4
P Befehl zum einrücken der textausgabe? Java Basics - Anfänger-Themen 6
A Befehl ausführen beim Schließen der Konsole Java Basics - Anfänger-Themen 3
S Gibt es einen Befehl "Mausklick" o.ä? Java Basics - Anfänger-Themen 6
S Java-Programm ohne -jar Befehl? Java Basics - Anfänger-Themen 9
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T JDK installiert aber der Befehl "javac" funktionie Java Basics - Anfänger-Themen 5
B ItemListener - setText Befehl geht nicht Java Basics - Anfänger-Themen 3
I JNLP - Datenstrom auslesen, Werte berechnen, Befehl automati Java Basics - Anfänger-Themen 6
R auf button klick befehl ausführen Java Basics - Anfänger-Themen 11
G Jar Befehl wird von DOS nicht erkannt Java Basics - Anfänger-Themen 24
G Unix Befehl ps unter Java Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben