# Ampel Programmieren



## DarkRaptor (14. Apr 2010)

Hallo liebe Forenmitglieder!
Ich bin ein Anfänger in sachen Java und hab mich mal an einer Ampel versucht.
Allerdings finde ich sie so noch etwas langweilig weil man jedes mal wen man einen zustand weiter schalten möche auf diesen button drücken muss. Jetzt ist also meine frage wie ich das so programmieren kann, dass man einen start und einen stop button hat und sich die zustände von allein vl. so in 1 sec intervallen weiterschalten. Bitte dringen um hilfe... und schon mal danke im vorraus!!!

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

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

public class Ampel2 extends JFrame {
  // Anfang Attribute
  private JButton jButton1 = new JButton();
  int i=0;
  int y=0;
  private ButtonGroup jButtonGroup1 = new ButtonGroup();

  // Ende Attribute


  public Ampel2(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 316;
    int frameHeight = 298;
    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

    jButton1.setBounds(24, 24, 89, 33);
    jButton1.setText("Start");
    jButton1.setVisible(true);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    jButton1.setToolTipText("Klicken um den Ampel-Zustand zu ändern");
    cp.add(jButton1);
    



// Ende Komponenten

    setResizable(false);
    setVisible(true);


  }

  // Anfang Methoden
  public void jButton1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
     i++;
     repaint();
   }
  
  public void paint(Graphics g){
    g.setColor(Color.GRAY);
    g.fill3DRect(27,95,89,170, true);
    if (i==1){
      g.setColor(Color.RED);
      g.fillOval(45,100,50,50);

    }
    if (i==2){
      g.setColor(Color.RED);
      g.fillOval(45,100,50,50);
      g.setColor(Color.YELLOW);
      g.fillOval(45,155,50,50);

    }
    if (i==3){
      g.setColor(Color.GREEN);
      g.fillOval(45,205,50,50);
    }

    if (i==4){
      g.setColor(Color.YELLOW);
      g.fillOval(45,155,50,50);
      i=0;
    }

  }

  public String getSelectedRadioButton(ButtonGroup bg) {
    for (java.util.Enumeration<AbstractButton> e = bg.getElements(); e.hasMoreElements();) {
      AbstractButton b = e.nextElement();
      if (b.isSelected()) return b.getText();
    }
    return null;
  }



  // Ende Methoden

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


----------



## cz3kit (14. Apr 2010)

Moin, also du hast das so Programmiert, dass die repaint Methode nur dann aufgerufen wird, wenn man den Button drückt und dementsprechend kann es auch nur da passieren. Was du also machen musst, ist die repaint Methode von dem Button zu lösen und irgendwo in Hintergrund in z.B. einer Schleife (Ich bin mir sicher dass es andere Möglichkeiten gibt) laufen zu lassen. Dann fügst du einfach 2 Buttons hinzu -Start und Stop- und zu denen fügst du dann jeweils ein ActionEvent hinzu, die dann deine Schleife anhält oder wieder startet.


----------



## Ein Keks (14. Apr 2010)

Ich denk mal du suchst so etwas: Swing Timer
Im Konstruktor kannst du dem Timer einen ActionListener und die Zeit die er zwischen den aufrufen warten soll (in millisekunden) mitgeben.
Die beiden methoden start() und stop() sollten selbsterklärend sein 

kleine Anmerkung: man überschreibt normalerweise nicht die paint-methode von JFrame sondern besser die paintComponent-methode eines JPanels/JComponent. Und wenn schon die paint-methode dann mit 
	
	
	
	





```
super.paint(g);
```


----------



## DarkRaptor (15. Apr 2010)

Wie gesagt ich bin Anfänger und versteh nicht so ganz was du meinst.
Wir haben halt in der Schule jetzt grade erst mit Java angefangen und ich hatte auch vorher keine Ahnung von irgenwelchen Programmiersprachen.
Also wäre net wenn du mal einen Quellcode posten könntest und mir da vieleicht ne kleien erklärung dran schreibst.:toll:


----------



## Ein Keks (15. Apr 2010)

```
Timer timer = new Timer(1000, new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e) {
     //diese methode wird jede sekunde ausgeführt solange der Timer läuft
     repaint(); // jetzt wird z.B. jede sekunde neu gezeichnet
  }
});
timer.start(); //jetzt läuft der timer
timer.stop(); //jetzt nicht mehr
```

noch ne kleine anmerkung^^ :
um ein fenster in der mitte des bildschirms zu positionieren kannst du 
	
	
	
	





```
setLocationRelativeTo(null);
```
 verwenden.


----------



## DarkRaptor (17. Apr 2010)

@Ein Keks
Genau so was hab ich gesucht danke!!!!:applaus:


----------

