carookee - group communication for you
Home / JavaForum / Beginner
Infos   |   Features   |   Gold-Edition   |   Kundenservice   
java
  Übersicht
  Forum
Beginner
Java allgemein
JDBC
JNI
Networking
Online-Ressourcen
Swing + AWT
XML
Meckerecke
  Mitglieder
LOGIN





· Passwort vergessen
· Kostenlos anmelden
  Information
  Demo
  Features
  Im Vergleich
  Anmeldung
SUCHE
Beiträge, Foren oder Verfasser finden:
  Kundenservice
  Impressum
  Datenschutz
  AGB
Status
5.935 User online
0 User eingeloggt
 

Beiträge
   Antworten     Neuer Beitrag    

Beitrag 42 von 2963 (1%) |<   <   >   >|

Autor Nautilus
Datum 16.11.05, 17:13
Betreff Ampelschaltung mit Threads.


Hi Leute, bin derzeit in der Einstiegsphase und wir haben in der Schule nun eine Aufgabe bekommen.

Wir sollen eine Ampelschaltung erstellen, welche zwei Ampeln erstellt und in Zeitintervalls jeweils eine auf rot und die andere auf rün stellt.

Das mit den Zeitintervalls soll mit Hilfe von Treads gelöst werden. Für die Wartezeit möchte ich den thread einfach für eine gewisse Zeit "schlafen legen".

Wir haben schon von unserem Lehrer eine fertige Ampelklasse erhalten, somit muss ich nur noch die Steuerung programmieren und damit tue ich es mir richtig schwer.

Hier ist die Ampelklasse meines Lehrers:

import java.awt.*;

public class Ampel extends Canvas {
    /** Zustand der Ampel */
    public int zustand;
    public int height;
    public int width;
    public int mid;
    public int drittel;
    public int yoffset;
    public int xoffset;
    /** Ampelzustand rot */
    public static final int ROT = 0;
    /** Ampelzustand gelb */
    public static final int GELB = 1;
    /** Ampelzustand grün */
    public static final int GRUEN = 2;
    /** Ampelzustand rot-gelb */
    public static final int ROTGELB = 3;
    /** Ampelzustand Ampel aus */
    public static final int AUS = 4;
    /**
    * Konstruktor bekommt Grösse der Ampel übergeben
    * @param h - Höhe der Ampel in Pixeln
    * @param w - Breite der Ampel in Pixeln
    */

    public Ampel(int w, int h) {
        this.setBackground(Color.white);
        height = h;
        width= w;
        mid = (int)(width/2);
        drittel = (int)(height/3);
        yoffset = (int)(width/20);
        xoffset = 1;
        this.setSize(w,h);
        zustand = Ampel.ROT;
        
    }
    
    /**
    * Standard paint Methode
    */

    public void paint(Graphics g) {
        int d = width-6;
        ringe(g);
        switch(zustand) {
            case Ampel.ROT:
            g.setColor(Color.red);
            g.fillOval(xoffset,yoffset,d,d);
            break;
            case Ampel.GELB:
            g.setColor(Color.yellow);
            g.fillOval(xoffset,drittel+yoffset,d,d);
            break;
            case Ampel.GRUEN:
            g.setColor(Color.green);
            g.fillOval(xoffset,2*drittel+yoffset,d,d);
            break;
            case Ampel.ROTGELB:
            g.setColor(Color.red);
            g.fillOval(xoffset,yoffset,d,d);
            g.setColor(Color.yellow);
            g.fillOval(xoffset,drittel+yoffset,d,d);
            break;
            default:
            break;
        }
    }
    
    /**
    * schwarze Ringe der Ampel zeichnen
    */

    public void ringe(Graphics g) {
        int d = width-5;
        g.setColor(Color.black);
        // Kreis für Rot
        g.drawOval(xoffset,yoffset,d,d);
        g.drawOval(xoffset,(int)(drittel)+yoffset,d,d);
        g.drawOval(xoffset,(int)(2*drittel)+yoffset,d,d);
        
    }
    /**
    * Ampel auf rot
    */

    public void rot() {
        zustand = Ampel.ROT;
        repaint();
    }
    /**
    * Ampel auf gelb
    */

    public void gelb() {
        zustand = Ampel.GELB;
        repaint();
    }
    /**
    * Ampel auf gruen
    */

    public void gruen() {
        zustand = Ampel.GRUEN;
        repaint();
    }
    /**
    * Ampel auf rot-gelb
    */

    public void rotgelb() {
        zustand = Ampel.ROTGELB;
        repaint();
    }
    /**
    * Ampel aus
    */

    public void aus() {
        zustand = Ampel.AUS;
        repaint();
    }
}


...und hier folgt mein versuch eine simple Ampelschaltung zu erzeugen:

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


public class Ampelfenster extends JPanel{
    public Ampelfenster(){
        ThreadAmpel t1 = new ThreadAmpel();
        
        setLayout(null);
        setBackground(Color.white);
        
        t1.start();
    }
    
    
    class ThreadAmpel extends Thread{
         public void run(){
            JTextField ausgabe = new JTextField(30);
            ausgabe.setBounds(10, 130, 60, 40);
            add(ausgabe);
            
            
            
            Ampel a1 = new Ampel(20, 50);
            Ampel a2 = new Ampel(20, 50);
            
            //(linker Seitenabstand, oberer Abstand, Breite, Höhe)
            a1.setBounds(10, 10, 40, 100);
            add(a1);
            a2.setBounds(60, 10, 40, 100);
            add(a2);
            a2.gruen();
            try{
                while(true){
                    for(int i=0; i>=3; i++){
                        switch(i){
                            //case 0: a1.rot();
                            //a2.gruen();
                            case 0: ausgabe.setText("hallo");
                            break;
                            case 1: a1.rotgelb();
                            a2.gelb();
                            repaint();
                            break;
                            case 2: a1.gelb();
                            a2.rotgelb();
                            repaint();
                            break;
                            case 3: a1.gruen();
                            a2.rot();
                            repaint();
                            break;
                            default: ausgabe.setText("default");
                        }
                        Thread.sleep(100);
                    }
                }
            }
            catch(Exception e){
            }
        }
    }
    
    
    public static void main(String [] args){
        JFrame f1 = new JFrame("Ampel");
        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f1.getContentPane().add(new Ampelfenster());
        f1.pack();
        f1.setSize(300, 400);
        f1.setVisible(true);
        
    }
    
    
}


Also, mein Problem ist, dass ich mit der Case Abfrage testen möchte, welche Zahl derzeit aktuell ist und möchte dementsprechend mit den methoden rot(), gelb(), gruen(), rotgelb() die Farbe der Ampel verstellen.

Das Textfeld habe ich nur testweise eingebaut, umu sehen, ob die Case-Abfrage denn auch funktioniert.
Die break Anweisung habe ich derzeit eingebaut, doch leider bringt mir das keine Verbesserung.
Allerdings sehe ich, dass die CPU Last beim starten des Programms nach ganz oben schnellt, was für mich ein Zeichen ist, dass die Endlosschleife wohl funktioniert und somit die ganze Last verursacht.

Guckt Euch doch mein ganzes Programm an und schaut, wie ich das verbessern kann. Bedenkt dabei bitte, dass ich blutiger Anfänger bin und mir deswen in Bezug auf Fehler alles zu zu trauen ist.

Bis denn...

Nautilus




Diskussionsverlauf:
Ampelschaltung mit Threads.
    Re: Ampelschaltung mit Threads.
    Re: Ampelschaltung mit Threads.

 Auf diesen Beitrag antworten
 Neuen Beitrag verfassen


|<   <   >   >|

                                                                                                                                                                                                                           

Impressum  · Datenschutz  · AGB  · Infos  · Presse
Ein modernes Forum: teamturn.com