Ampel

Zyrax

Mitglied
Hi Leute,

ich soll 'ne Ampel mit 'nem Frame programmieren, die nur 1 Button hat. Mein Problem ist, dass ich mit den Bedingungen für den if-Befehl nicht zurecht komme:



Java:
public class Ampel extends JFrame {
  // Anfang Attribute

  private JPanel jPanel1 = new JPanel(null);
  private JPanel jPanel2 = new JPanel(null);
  private JPanel jPanel3 = new JPanel(null);
  private JButton jButton1 = new JButton();
  // Ende Attribute

  public Ampel(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 298;
    int frameHeight = 556;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jPanel1.setBounds(69, 87, 99, 100);
    cp.add(jPanel1);
    jPanel2.setBounds(69, 192, 99, 99);
    cp.add(jPanel2);
    jPanel3.setBounds(69, 293, 100, 100);
    cp.add(jPanel3);
    jButton1.setBounds(69, 418, 99, 38);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    
    jPanel1.setBackground(Color.GRAY);
    jPanel2.setBackground(Color.GRAY);
    jPanel3.setBackground(Color.GRAY);

    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden



  public void jButton1_ActionPerformed(ActionEvent evt) {
    if(Color.gray.equals(jPanel1) && Color.gray.equals(jPanel2) && Color.gray.equals(jPanel3)){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }else if(Color.gray.equals(jPanel1) && Color.yellow.equals(jPanel2) && Color.gray.equals(jPanel3)){
      jPanel1.setBackground(Color.red);
      jPanel2.setBackground(Color.gray);
      jPanel3.setBackground(Color.gray);
    }else if(Color.red.equals(jPanel1) && Color.gray.equals(jPanel2) && Color.gray.equals(jPanel3)){
      jPanel1.setBackground(Color.red);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }else if(Color.red.equals(jPanel1) && Color.yellow.equals(jPanel2) && Color.gray.equals(jPanel3)){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.gray);
      jPanel3.setBackground(Color.green);
    }else if(Color.gray.equals(jPanel1) && Color.gray.equals(jPanel2) && Color.green.equals(jPanel3)){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }// TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new Ampel("Ampel");
  }
}
 

Xeonkryptos

Bekanntes Mitglied
Das kann auch nichts werden, da du eine Farbkonstante mit einem Panel-Objekt vergleichst und diese NIEMALS gleich sind!

Du musst die Hintergrundfarbe des jeweiligen Panels erfragen und darauf prüfen, ob diese Farbe identisch der zu überprüfenden Farbe ist. Häng einfach mal an deinen Panels in den Abfragen die getBackground-Methode dran!
 

Zyrax

Mitglied
Sorry, aber ich verstehe leider nichts davon, hbe vor ca. 3 Wochen damit angefangen ^^''

Aber das, was ich gerade suche, ist, wie ich den Vergleich der Farbe des Panels in das Argument vom if reinschreibe, also wie der Befehl dazu aussieht.
 

Xeonkryptos

Bekanntes Mitglied
Dann empfehle ich dir, erstmal die Grundlagen von Java anzueignen, da du wohl noch nicht verstehst, was es sich mit den unterschiedlichen Referenzen und Konstanten in Java auf sich hat.

Ein Beispiel an deinem Code, wobei ich die Überprüfung nicht ganz folgen kann:
Java:
 if(Color.gray.equals(jPanel1.getBackground()) && Color.gray.equals(jPanel2.getBackground()) && Color.gray.equals(jPanel3.getBackground())){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }
In diesem Codeschnipsel solltest du erkennen, dass ich die Methode getBackground() an die jPanels hinzugefügt habe, um nach ihrer Farbe zu fragen! Wenn du das nicht machst, dann erfragst du die Referenz des Objektes! Die Referenz vom Objekt verrät dir aber nicht, welche Farbe dieses hat!!

Wenn du dieses Beispiel anwendest, dann funktioniert auch deine Überprüfung, sofern diese sinnig sind!

Und schaue dir unbedingt die Basics von Java an. Du hast noch keinerlei oder sehr wenige Kenntnisse von den Basics und versuchst dich schon an einer GUI, dass ist kontra produktiv.
 

Zyrax

Mitglied
Sry für Doppelpost, aber ich glaube, ich bin'n Schritt weiter:

Java:
    Color r = jPanel1.getBackground();
    Color y = jPanel2.getBackground();
    Color g = jPanel3.getBackground();

Jetzt muss ich nur noch wissen, wie ich das im if vergleiche :/
 

Zyrax

Mitglied
Den Abschnitt, den du dir ausgesucht hast, verstehe ich auch nicht ganz. Ich war am letzten Tag krank, und meine Kameraden haben den if-Befehl durchgenommen, aber ich war ja nicht da und keiner von ihnen hat es verstanden, um's mir zu erklären. Also hab ich's gegoogelt, aber da komme ich auch nicht recht weiter. Der Teil, der im Argument vom if steht, hab ich vom Internet. Ich wusste nicht so recht, wie ich die Farben vergleichen soll.
 

Xeonkryptos

Bekanntes Mitglied
Es ist mit dem If-Clause ganz einfach. Im if-clause überprüfst du, ob eine Aussage wahr ist oder nicht: true/false.

Mit equals führst du eine Überprüfung aus, ob etwas gleich ist oder nicht. true = gleich, false = ungleich.

Soweit so gut. Ein If-clause ist so aufgebaut:
Java:
if(Bedingung) { Anweisung1; Anweisung2;}

Ist nun die Bedingung, wie der Vergleich wahr = true, dann werden die Anweisungen Anweisung1 und Anweisung2 ausgeführt. Ist dies nicht der Fall werden diese übersprungen und es wird weiter im Code vorangegangen. Natürlich kannst du noch ein else if daran hängen, was ausgeführt wird und prüft, ob eine andere Bedingung wahr ist, wenn die zuvor geprüfte unwahr = false ist.

Und dein Ziel ist es herauszufinden, ob die Bedingung wahr ist und darauf zu reagieren und wenn nicht, auf eine andere Art zu überprüfen, sofern gewollt, und dann bei true halt anderst zu reagieren.

In deinem Fall der Wechsel der Farben.

Nun musst du aber zum Überprüfen, ob das Panel die gewisse Farbe hat, wissen, welche Farbe das Panel nun hat. Dies hast du nicht erfragt! Mit der Methode getBackground auf dem Panel angewandt, erfragst du diese Farbe und kannst sie mit den Farbkonstanten vergleichen und bei Gleichheit darauf reagieren.
 

Zyrax

Mitglied
OK, vielen Dank. Soweit klappt das ganz gut :)

Aber ich hätte noch eine Frage. Ich hatte die Idee, jedem einzelnen Zustand eine Zahl zuzuordnen, die sich bei jedem einzelnen Schaltvorgang verändert. Das Problem: Wenn ich i im Konstruktor initialisiere, kann die Methode auf i nicht zugreifen. Also habe ich etwas verändert, aber dann möchte er, dass ich i initialisiere :/

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 26.10.2011
  * @author
  */

public class Ampel2 extends JFrame {
  // Anfang Attribute

  private JPanel jPanel1 = new JPanel(null);
  private JPanel jPanel2 = new JPanel(null);
  private JPanel jPanel3 = new JPanel(null);
  private JButton jButton1 = new JButton();
  // Ende Attribute

  public Ampel2(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 298;
    int frameHeight = 556;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jPanel1.setBounds(69, 87, 99, 100);
    cp.add(jPanel1);
    jPanel2.setBounds(69, 192, 99, 99);
    cp.add(jPanel2);
    jPanel3.setBounds(69, 293, 100, 100);
    cp.add(jPanel3);
    jButton1.setBounds(69, 418, 99, 38);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });

    jPanel1.setBackground(Color.GRAY);
    jPanel2.setBackground(Color.GRAY);
    jPanel3.setBackground(Color.GRAY);

    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden



  public void jButton1_ActionPerformed(ActionEvent evt) {
    int i;
    if(Color.gray.equals(jPanel1.getBackground())&&Color.gray.equals(jPanel2.getBackground())&&Color.gray.equals(jPanel3.getBackground())){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i=1;
    }else if(i=1){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }else if(i=2){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }else if(i=3){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }else if(i=4){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
    }// TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new Ampel2("Ampel2");
  }
}
 
Zuletzt bearbeitet von einem Moderator:

Zyrax

Mitglied
Sorry :)

Hier, ich hab's verändert. Jetzt klappt's sogar, nur ist das Problem, dass ich i nicht hochgerechnet wird:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 26.10.2011
  * @author
  */

public class Ampel2 extends JFrame {
  // Anfang Attribute

  private JPanel jPanel1 = new JPanel(null);
  private JPanel jPanel2 = new JPanel(null);
  private JPanel jPanel3 = new JPanel(null);
  private JButton jButton1 = new JButton();
  // Ende Attribute

  public Ampel2(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 298;
    int frameHeight = 556;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jPanel1.setBounds(69, 87, 99, 100);
    cp.add(jPanel1);
    jPanel2.setBounds(69, 192, 99, 99);
    cp.add(jPanel2);
    jPanel3.setBounds(69, 293, 100, 100);
    cp.add(jPanel3);
    jButton1.setBounds(69, 418, 99, 38);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });

    jPanel1.setBackground(Color.GRAY);
    jPanel2.setBackground(Color.GRAY);
    jPanel3.setBackground(Color.GRAY);

    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden



  public void jButton1_ActionPerformed(ActionEvent evt) {
    int i=0;
    if(Color.gray.equals(jPanel1.getBackground())&&Color.gray.equals(jPanel2.getBackground())&&Color.gray.equals(jPanel3.getBackground())){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==1){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==2){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==3){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==4){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i=1;
    }// TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new Ampel2("Ampel2");
  }
}
 

Xeonkryptos

Bekanntes Mitglied
i wird nicht hochgerechnet, weil du es als lokale Variable implementiert hast, wodurch die variable nach jedem Methodenaufruf erstellt wird und nach jedem verlassen der Methode wieder aus dem speicher entfernt wird.
Du müsstest i als eine Instanzvariable deklarieren. Dann wird sie auch hochgezählt, weil sie solange bestehen bleibt, solange die Klasse in der JVM aktiv ist!
 

Zyrax

Mitglied
Aber wie mache ich das? Weil eigentlich müsste ich ja i im Konstruktor initialisieren, aber wenn ich das mache, kann die Methode nicht auf i zugreifen. :?
 

Xeonkryptos

Bekanntes Mitglied
Initialisieren ist nicht deklarieren!!! Initialisieren ist der Variable einen Wert zuweisen und deklarieren sie zu definieren:
Java:
int i;
<-- Deklaration
Java:
int i = 1;
<-- Initialisierung

Und mal ein Tipp: Deine JPanels und dein Button sind auch ALLES Instanzvariablen. Und jetzt versuch aus deinem "i" eine Instanzvariable zu machen.
 

Zyrax

Mitglied
Eig. schon:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 26.10.2011
  * @author
  */

public class Ampel2 extends JFrame {
  // Anfang Attribute

  private JPanel jPanel1 = new JPanel(null);
  private JPanel jPanel2 = new JPanel(null);
  private JPanel jPanel3 = new JPanel(null);
  private JButton jButton1 = new JButton();
  private int i=0;
  // Ende Attribute

  public Ampel2(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 298;
    int frameHeight = 556;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jPanel1.setBounds(69, 87, 99, 100);
    cp.add(jPanel1);
    jPanel2.setBounds(69, 192, 99, 99);
    cp.add(jPanel2);
    jPanel3.setBounds(69, 293, 100, 100);
    cp.add(jPanel3);
    jButton1.setBounds(69, 418, 99, 38);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });

    jPanel1.setBackground(Color.GRAY);
    jPanel2.setBackground(Color.GRAY);
    jPanel3.setBackground(Color.GRAY);

    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden



  public void jButton1_ActionPerformed(ActionEvent evt) {
    if(i==0){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==1){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==2){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==3){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i++;
    }else if(i==4){
      jPanel1.setBackground(Color.gray);
      jPanel2.setBackground(Color.yellow);
      jPanel3.setBackground(Color.gray);
      i=1;
    }// TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new Ampel2("Ampel2");
  }
}
 

Xeonkryptos

Bekanntes Mitglied
Dein Programm funktioniert einwandfrei! Dein Fehler ist, dass du immer die selben Farben zeichnen lässt! Egal welche Nummer die Zahl hat, es wird immer das oberste Feld grau und das unterste Grau, während das in der Mitte gelb gezeichnet wird. Du änderst keine Farben, siehst also auch keine Veränderung!
 

Ähnliche Java Themen

Neue Themen


Oben