Simulation einer Verkehrsampel (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Die Seite wurde neu angelegt: „Die Klasse ''Ampel.java'' baut unserer Projekt in einem Fenster zusammen und startet es. <code=java> import javax.swing.*; * * @author Gernot Segieth: p…“
 
KKeine Bearbeitungszusammenfassung
Zeile 34: Zeile 34:
</code=java>
</code=java>


''Tactable.java'' ist ein Interface, dass Klassen implementieren müssen, wenn sie über Änderungen der Ampelphasen imformiert werden möchten.
''Tactable.java'' ist ein Interface, das Klassen implementieren müssen, wenn sie über den Wechsel der Ampelphasen informiert werden möchten.
<code=java>
<code=java>
/**
/**
Zeile 112: Zeile 112:
</code=java>
</code=java>


''Tact.java' beschreibt Takte und Wartezeiten bzw. Phasen, die eine Ampelschaltung durchläuft.
''Tact.java' beschreibt Takte bzw. Wartezeiten, die eine Ampelschaltung einer Verkehrsampel durchläuft.
<code=java>
<code=java>
/**
/**

Version vom 10. Februar 2018, 11:57 Uhr

Die Klasse Ampel.java baut unserer Projekt in einem Fenster zusammen und startet es. <code=java> import javax.swing.*;

/**

* @author Gernot Segieth
*/

public class Ampel {

  public Ampel() {
     try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     }
     catch(Exception e) {
        System.err.println(e);
     }
     JFrame f = new JFrame("Ampel-Simulation");
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     f.add(new AmpelPanel());
     f.pack();
     f.setLocationRelativeTo(null);
     f.setVisible(true);
  }
  public static void main(String[] args) {
     SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
           new Ampel();
        }
     });
  }

} </code=java>

Tactable.java ist ein Interface, das Klassen implementieren müssen, wenn sie über den Wechsel der Ampelphasen informiert werden möchten. <code=java> /**

* @author Gernot Segieth
*/

public interface Tactable {

  public void next();

} </code=java>

AmpelPanel.java beschreibt die virtuelle Hardware unserer Ampel. Sie zeichnet die Ampel und die Ampelphasen. <code=java> import java.awt.*; import javax.swing.*;

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


/**

* @author Gernot Segieth
*/

public class AmpelPanel extends JPanel implements Tactable {

  private int phase;
  
  public AmpelPanel() {
     setBackground(Color.WHITE);
     Tact tact = new Tact(this);
     tact.start();
  }
  public void next() {
     phase++;
     repaint();
     if(phase > 3) {
        phase = 0;
     }
  }
  
  protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.fillRoundRect(10, 10, 200, 600, 10, 10);
        g.setColor(Color.DARK_GRAY);
        g.fillOval(20, 20, 180, 180);
        g.fillOval(20, 220, 180, 180);
        g.fillOval(20, 420, 180, 180);
     
     switch(phase) {
        case 0:
        g.setColor(Color.RED);
        g.fillOval(20, 20, 180, 180);
        break;
        
        case 1:
        g.setColor(Color.RED);
        g.fillOval(20, 20, 180, 180);
        g.setColor(Color.YELLOW);
        g.fillOval(20, 220, 180, 180);
        break;
        
        case 2:
        g.setColor(Color.GREEN);
        g.fillOval(20, 420, 180, 180);
        break;
        
        case 3:
        g.setColor(Color.YELLOW);
        g.fillOval(20, 220, 180, 180);
        break;
     }
  }
  
  public Dimension getPreferredSize() {
     return new Dimension(220, 620);
  }

} </code=java>

Tact.java' beschreibt Takte bzw. Wartezeiten, die eine Ampelschaltung einer Verkehrsampel durchläuft. <code=java> /**

* @author Gernot Segieth
*/

public class Tact extends Thread {

  private Tactable tactable;
  public Tact(Tactable tactable) {
     this.tactable = tactable;
  }
  public void run() {
     while(!isInterrupted()) {
        Tact.sleep(8000);
        tactable.next();
        Tact.sleep(2000);
        tactable.next();
        Tact.sleep(10000);
        tactable.next();
        Tact.sleep(5000);
        tactable.next();
     }
  }
  public static void sleep(long millis) {
     try {
        Thread.sleep(millis);
     }
     catch(InterruptedException e) {
        System.err.println(e);
        Thread.currentThread().interrupt();
     }
  }

} </code=java>