Applet startet Pause zu früh !?!

modstyle

Mitglied
heyho leudde !

seit einigen tagen versuche ich nun ein wahrscheinlich sehr banales problem anzugehen, ich komme jedoch nicht auf den fehler ...

mit folgenden zeilen rufe ich die prozedur auf, die das applet kurzzeitig anhalten soll:


farbe = "orange";
repaint();

sleep(1000); <------ !!!

formular(3);
farbe = "rot";
repaint();


die prozedur, die das applet anhält:


public void sleep(int pause)
{ // kleine Pause
try
{
Thread.sleep(pause);
}
catch (InterruptedException e) {}
}


dabei wird ein orange-farbener kreis gezeichnet und dann der ablauf für 1 sec. angehalten, um dann einen roten kreis zu zeichnen ...

das problem: er zeichnet den orange-farbenen kreis nicht vor der pause ... zunächst hält das applet für die angegebene zeit an und dann wird der organe-farbene kreis gezeichnet und direkt danach der rote, also bemerkt man den orangenen überhaupt nicht ...
das komische an der sache: ersetze ich in der prozedur "sleep" Thread.sleep durch wait also: wait(pause); so wird der orange-farbene Kreis gezeichnet aber das Applet nach der vorgegebenen Zeit nicht fortgesetzt d.h. der rote Kreis nicht gezeichnet ! ... eigentlich müsste jedoch beides zum selben ergebnis führen, oder nicht ?!?!?! ...

wenn einer eine idee hat dieses problem zu lösen oder einen anderen weg weiss eine anwendung für eine variable zeit kurz anzuhalten und dann fortzuführen ohne threads, wäre ich für die hilfe sehr dankbar ! ... thx schonma im voraus ...

mfg

modstyle
 
Zuletzt bearbeitet:
Servus!

Muss jetzt zur Akademie... kümmere mich huete Abend darum!
Kannst du mir bis dahin vielleicht noch den Programmablauf ein wenig detaillierter beschreiben?

Soll das ganze so aussehen

Code:
 _______________________________________
|
|O (Kreis:Orange) --->
|
|O (Kreis: rot) --->
|

pseudo Code:

while (true ) {
...
x_koord_Kreise++;

repaint(Kreis_Orange);
sleep(1000);
repaint(Kreis_Rot);
...
}

So ungefähr ?

Vielleicht hilft dir auch das hier:
http://www.tutorials.de/tutorials76788.html

Gruss Tom
 
heyho !

schonmal danke für den link, aber genau das will ja nicht so recht klappen also ich hab es ja schon mit threads probiert ...

es geht nicht um die animation der objekte ... das programm soll folgendes tun:

es wird eine ampel gezeichnet, die grün zeigt, wenn der user auf den button klickt springt die ampel auf orange und wartet dann eine per zufall (ist noch nicht eingebaut) ermittelte zeit, bevor die ampel auf rot springt. sobald die ampel rot zeigt soll der user auf "stop" klicken.

also eine art reaktionstest, weil ich für physik einen bremsweg-ermittler code ... vorher gibt man noch über ein formular verschiedene daten zur fahrbahnbeschaffenheit ein aber das funktioniert alles wunderbar ... das einzige problem was ich hab ist eben diese zeit zwischen orange und rot zu überbrücken ...

mfg
 
Servus!
Schau Dir das mal an...


Code:
/*
 * Created on 27.05.2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

import java.awt.*;
import java.awt.event.*;

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Ampel extends Frame {
	/**
	 * 
	 */
	Button btn1;
	Button btn2;
	Panel pan1;
	
    long  zeit1 = 0;	
	
	Graphics gra;
	
	public Ampel() {
		super("Ampel");
		this.setSize(new Dimension(320,320));
		this.setLayout(new BorderLayout());
		pan1 = new Panel();
		
		
		pan1.setSize(150,150);
		
		this.add(pan1,BorderLayout.NORTH);
		
			
		
		
		
		this.addWindowListener(new WindowClosingAdapter());
		pan1.add(btn1 = new Button("Start"));
		btn1.setActionCommand("start");
		btn1.addMouseListener(new MousePressedAdapter());
		pan1.add(btn2 = new Button("Stop"));
		btn2.setActionCommand("stop");
		btn2.addMouseListener(new MousePressedAdapter());
		
		
		
		show();
		
		// TODO Auto-generated constructor stub
	}
	public static void main(String[] args) {
	Ampel a = new Ampel();
	
	}
	
	public void run(){
		gra = this.getGraphics();
		gra.setColor(Color.GREEN);
		gra.fillOval(50,75,55,55);
	    try{
	    	Thread.sleep(2000);
	    }catch(InterruptedException ie){
	    	System.out.println(ie);
	    }
	    
		gra.setColor(Color.YELLOW);
		gra.fillOval(50,130,55,55);	    
	    
		try{
			Thread.sleep( (int)(Math.random()*10 + 1) * 500);
		}catch(InterruptedException ie){
			System.out.println(ie);
		}
		

		gra.setColor(Color.RED);
		gra.fillOval(50,185,55,55);	    
	    zeit1 = System.currentTimeMillis();
				
	}
	

    public void paint(Graphics g){
    	
    }
	
	
	
	class MousePressedAdapter extends MouseAdapter {
		public void mousePressed(MouseEvent event) {
			Object evt;
			if ((evt = event.getSource()) instanceof Button) {
				if (((Button) evt).getActionCommand().equals("start")) {
					System.out.println("start");
					run();
				}
				if (((Button) evt).getActionCommand().equals("stop")) {
					System.out.println("stop");
					if(zeit1 != 0){
						gra.drawString("Du hast " + (System.currentTimeMillis() - zeit1)/1000 + " Sekunden gebraucht", 10,280);
					}
				}
			}
		}
	}
	class WindowClosingAdapter extends WindowAdapter {
		public void windowClosing(WindowEvent event) {
			hide();
			dispose();
			System.exit(0);
		}
	}
}

Gruss Tom
 
heyho !

thx für deine hilfe und dass du hier nen ganzen applet gecodet hast aber im grunde hab ich das ja genau so gemacht ...

es funktioniert ja auch alles nur eben, dass er das orange nach der pause zeichnet, obwohl es wie bei dir auch vor dem thread-pause-teil steht ...

mfg
 
heyho !

habe mir gedacht ich poste hier einfach mal mein komplettes applet ...

ich weiss, dass es schlecht gecodet ist aber ich bin nunmal ein blutiger anfänger ...

die werte für geschwindigkeit usw. werden noch nicht ausgelesen

Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.Date;

public class Applet1 extends Applet implements Runnable, ActionListener 
{
	
	Label titel = new Label("Vorraussetzungen für den Bremstest");
	Label beG = new Label("Geschindigkeit (km/h):");
	Label beS = new Label("Schnee:");
	Label beR = new Label("Regen:");
	Label beE = new Label("Eis:");
	TextField ge = new TextField(5);
	Choice aS = new Choice();
	Choice aR = new Choice();
	Choice aE = new Choice();
	Button ok = new Button("OK");
	Button btn_start = new Button("START !");
	Button btn_stop = new Button("STOP !");
	
	
	long zeit, zeit1;
	String farbe;
	
	int zeichnen;
	
	
	
	
	
	//Startwerte
	public void init()
	{
		zeichnen = 0;
		zeit = 0;
		
		setSize(300,400);
        setBackground(new Color(255,255,255));
		setLayout(null);
		
		formular(1);
	}
	
	public void run(){
		
	}
	
	//Ampel zeichnen
	public void paint(Graphics g)
	{
		if (zeichnen == 1){
			g.drawRect(125,45,60,180);
			g.setColor(Color.gray);
			g.fillRect(126,46,59,179);
			g.setColor(Color.black);
			g.drawOval(130,50,50,50);
			g.drawOval(130,110,50,50);
			g.drawOval(130,170,50,50);
		}
		
		if (farbe == "grün"){	
			g.setColor(Color.darkGray);
			g.fillOval(131,51,49,49);
			g.fillOval(131,111,49,49);
			g.setColor(Color.green);
			g.fillOval(131,171,49,49);
		}else if (farbe == "orange"){
			g.setColor(Color.darkGray);
			g.fillOval(131,51,49,49);
			g.fillOval(131,171,49,49);
			g.setColor(Color.orange);
			g.fillOval(131,111,49,49);
		}else if (farbe == "rot"){
			g.setColor(Color.darkGray);
			g.fillOval(131,171,49,49);
			g.fillOval(131,111,49,49);
			g.setColor(Color.red);
			g.fillOval(131,51,49,49);
		}
		
	}
	
	//Prozedur zur Änderung der Anzeige
	void formular(int x)
	{
		if (x==1){
			//Eingabe-Formular für die Startwerte
			titel.setFont(new Font("TimesRoman",  Font.BOLD,   16));
			titel.setBounds(10,10,300,30);
			add(titel); 
			
			//Geschwindigkeit Label und Eingabefeld
			beG.setBounds(60,60,130,20);
			add(beG);
			
			ge.setBounds(190,60,30,20);
			add(ge);
			
			//Wert für Schnee
			beS.setBounds(10,100,50,20);
			add(beS);
			
			int i;
			
			for(i=0;i<=10;i++){
				aS.add(String.valueOf(i));	
			}
			aS.setBounds(60,100,40,20);
			add(aS);
			
			//Wert für Regen
			beR.setBounds(110,100,45,20);
			add(beR);
			
			for(i=0;i<=10;i++){
				aR.add(String.valueOf(i));	
			}
			aR.setBounds(155,100,40,20);
			add(aR);
			
			//Wert für Eis
			beE.setBounds(205,100,30,20);
			add(beE);
			
			for(i=0;i<=10;i++){
				aE.add(String.valueOf(i));	
			}
			aE.setBounds(235,100,40,20);
			add(aE);
			
			//Bestätigungs-Button
			ok.setBounds(130,150,50,20);
			add(ok);
			ok.addActionListener(this);
		
		
		}else if (x==2){
			//Ampel mit Reaktionstest-Button
			titel.setText("Reaktionstest");
			titel.setBounds(100,10,200,30);
			btn_start.setBounds(130,250,50,20);
			add(btn_start);
			btn_start.addActionListener(this);
			remove(ok);
			remove(beS);
			remove(beR);
			remove(beE);
			remove(aS);
			remove(aR);
			remove(aE);
			remove(ge);
			remove(beG);
			
		}else if (x==3){
			//Stop-Button
			remove(btn_start);
			btn_stop.setBounds(130,250,50,20);
			add(btn_stop);
			btn_stop.addActionListener(this);
		}
	}
	
	//Button-Aktions-Verarbeitung
	public void actionPerformed(ActionEvent e)
	{
		
		Object o;
		o = e.getSource();
		
		if(o == ok){
			formular(2);
			farbe = "grün";
			zeichnen = 1;
			repaint();	
		}else if (o == btn_start){
	        btn_start.setVisible(false);
			farbe = "orange";
			repaint();
			
			sleep(1000);
			
			formular(3);
			farbe = "rot";
			repaint();
		
			Date bla = new Date();
			zeit = bla.getTime();
		}else if (o == btn_stop){
			Date bla1 = new Date();
			zeit1 = bla1.getTime();
			zeit = zeit1 - zeit;
			
			titel.setText(zeit + " ms");
			remove(btn_stop);
			
			zeichnen = 0;
			farbe = "x";
			repaint();
		}
	}
	
	public void sleep(int pause)
    { // kleine Pause
		try
		{
	    	Thread.sleep(pause);
	    }catch(InterruptedException ie)
		{
	    	System.out.println(ie);
	    }
	}
    

	
}

hoffe es ist nicht all zu schlimm geschrieben :| ...

mfg
 
Servus!

Hier mal ne leicht abgewandelte Version deines Applets ... hab ehrlich gesagt im Moment nicht den blassesten Schimmer weshalb der Thread nach dem Orangenen nicht schläft wie er soll bzw. schlafen tut er ja, zeigt aber die orangene Lampe nicht an ...

Na ja hiermit kannst du vielleicht etwas mehr anfangen ...

P.s.: Wenn nach "go" unten keine Schaltflächer erscheint dann zieh mal den Appletviewer grösser bzw. verdecke mal das Applet damit die "Native" repaint() Methode aufgerufen wird ...

Code:
/*
 * MyAWTAPP.java
 *
 * Created on 28. Mai 2003, 00:57
 */

/**
 *
 * @author  Administrator
 */

import java.awt.*;
import java.awt.event.*;

public class MyAWTAPP extends java.applet.Applet {
    
    /** Initializes the applet MyAWTAPP */
    
    boolean run = false;
    
    Label titel;
    Label beG;
    Label beS;
    Label beR;
    Label beE;
    TextField ge;
    Choice aS;
    Choice aR;
    Choice aE;
    Button GO;
    
    
    Graphics gr = null;
    
    
    long milis = 0l;
    
    
    public void init() {
        this.setSize(300,400);
        
        initComponents();
        
        this.panel2.setLayout(null);
        
        titel = new Label("Vorraussetzungen für den Bremstest");
        beG= new Label("Geschindigkeit (km/h):");
        beS= new Label("Schnee:");
        beR = new Label("Regen:");
        beE = new Label("Eis:");
        ge = new TextField(5);
        aS = new Choice();
        aR = new Choice();
        aE = new Choice();
        GO = new Button("GO");
        
        this.panel1.setVisible(false);
        this.formular();
        
        
        
        
        
    }
    
    public void start(){
        
    }
    
    public void run(){

        gr = this.panel2.getGraphics();
        if(!(run)){
            System.out.println("Clear");
            gr.clearRect(0,0,300,300);
        }
        
        gr.drawRect(125,45,60,180);
        gr.setColor(Color.gray);
        gr.fillRect(126,46,59,179);
        gr.setColor(Color.black);
        gr.drawOval(130,50,50,50);
        gr.drawOval(130,110,50,50);
        gr.drawOval(130,170,50,50);
        
        
        gr.setColor(Color.darkGray);
        gr.fillOval(131,51,49,49);
        gr.fillOval(131,111,49,49);
        gr.setColor(Color.green);
        gr.fillOval(131,171,49,49);
        
        if(run){
            
            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){
                System.out.println(ie);
            }
            
            
            gr.setColor(Color.darkGray);
            gr.fillOval(131,51,49,49);
            gr.fillOval(131,171,49,49);
            gr.setColor(Color.orange);
            gr.fillOval(131,111,49,49);
            
            
            
            try{
                Thread.sleep((int)(Math.random() * 5000));
            }catch(InterruptedException ie){
                System.out.println(ie);
            }
            
            this.milis = System.currentTimeMillis();
            
            gr.setColor(Color.darkGray);
            gr.fillOval(131,171,49,49);
            gr.fillOval(131,111,49,49);
            gr.setColor(Color.red);
            gr.fillOval(131,51,49,49);
            
        }
    }
    
    public void paint(Graphics g){
        
        
    }
    
    
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        panel1 = new java.awt.Panel();
        button1 = new java.awt.Button();
        button2 = new java.awt.Button();
        panel2 = new java.awt.Panel();

        setLayout(new java.awt.BorderLayout());

        panel1.setBackground(new java.awt.Color(102, 153, 255));
        button1.setLabel("OK");
        button1.setName("bntOK");
        button1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                button1MouseClicked(evt);
            }
        });

        panel1.add(button1);

        button2.setLabel("STOP");
        button2.setName("btnSTOP");
        button2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                button2MouseClicked(evt);
            }
        });

        panel1.add(button2);

        add(panel1, java.awt.BorderLayout.SOUTH);

        panel2.setBackground(new java.awt.Color(204, 255, 204));
        add(panel2, java.awt.BorderLayout.CENTER);

    }
    
    private void button2MouseClicked(java.awt.event.MouseEvent evt) {
        // Add your handling code here:
        
        
        
        
        if(this.gr != null){
            if (this.milis != 0){
                
                gr.clearRect(0,0,300,300);
                
                titel.setText( (System.currentTimeMillis() - milis)  + " ms");
                //gr.drawString("Du hast " + (System.currentTimeMillis() - milis)/1000 + " Sekunde(n) gebraucht",50,35);
                System.out.println("STOP");
            }
        }
        
        
    }
    
    private void button1MouseClicked(java.awt.event.MouseEvent evt) {
        // Add your handling code here:
        run = true;
        
        run();
    }
    
    private void GOMouseClicked(java.awt.event.MouseEvent evt){
        
        this.panel1.setVisible(true);
        this.panel1.show();
        //paint(this.panel1.getGraphics());
        
        paint(this.getGraphics());
        
        titel.setText("Reaktionstest");
        
        panel2.remove(GO);
        panel2.remove(beS);
        panel2.remove(beR);
        panel2.remove(beE);
        panel2.remove(aS);
        panel2.remove(aR);
        panel2.remove(aE);
        panel2.remove(ge);
        panel2.remove(beG);
        panel2.repaint();
        run();
        
    }
    
    public void formular() {
        //Eingabe-Formular für die Startwerte
        titel.setFont(new Font("TimesRoman",  Font.BOLD,   16));
        titel.setBounds(10,10,300,30);
        panel2.add(titel);
        
        //Geschwindigkeit Label und Eingabefeld
        beG.setBounds(60,60,130,20);
        panel2.add(beG);
        
        ge.setBounds(190,60,30,20);
        panel2.add(ge);
        
        //Wert für Schnee
        beS.setBounds(10,100,50,20);
        panel2.add(beS);
        
        
        for(int i=0;i<=10;i++){
            aS.add(String.valueOf(i));
        }
        aS.setBounds(60,100,40,20);
        panel2.add(aS);
        
        //Wert für Regen
        beR.setBounds(110,100,45,20);
        panel2.add(beR);
        
        for(int i=0;i<=10;i++){
            aR.add(String.valueOf(i));
        }
        aR.setBounds(155,100,40,20);
        panel2.add(aR);
        
        //Wert für Eis
        beE.setBounds(205,100,30,20);
        panel2.add(beE);
        
        for(int i=0;i<=10;i++){
            aE.add(String.valueOf(i));
        }
        aE.setBounds(235,100,40,20);
        panel2.add(aE);
        
        //Bestätigungs-Button
        GO.setBounds(130,300,50,20);
        panel2.add(GO);
        
        GO.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                GOMouseClicked(evt);
            }
        });
        
        
        
    }
    
    
    // Variables declaration - do not modify
    private java.awt.Button button1;
    private java.awt.Panel panel2;
    private java.awt.Button button2;
    private java.awt.Panel panel1;
    // End of variables declaration
    
}

Gruss Tom
 
Servus!

Hab jetzt ne Antwort für dein Problem...

Du musst das in einem eigenen Thread starten, so lange du im Event Handler
der Gui bist (also actionPerformed() nicht verlassen hast) wird kein redraw
gemacht.

Gruss Tom
 
heyho !

hab es endlich hingekriegt !!! ... habe einfach das sleep in die paint-methode verlagert und das zeichnen des roten und orangenen in einen einzigen else if -teil gepackt ...

also paint sieht dann immer ungefähr so aus:

void paint(gfx)
{
rahmen_zeichnen;
grüne_ampel_zeichnen;

if(soweit_ist){
orange_zeichnen;
stoppen;
rot_zeichnen;
aktuelle_zeit_auslesen;
}

}

das repaint steht jetzt ganz am ende der action-performed-prozedur und wird dann halt nach beenden, wie du gesagt hast, ausgeführt.

danke für deine sehr schnelle, professionelle und ausführliche hilfe ... find ich echt super !

studierst du etwas in die richtung oder sind das alles selbst angeeignete dinge ?

bin nicht so der coder sondern eher gfxler ;)

mfg
 
Zuletzt bearbeitet:
Servus!

Prima, dass du es jetzt selbst hinbekommen hast, so lob ich mir die User ;-)

Studiere WiInf. an einer Berufsakademie ... ansonsten begeisterter Java-Anhänger und "Hobbyinformatiker" ... da bleibt schon mal was hängene ;-)

Gruss Tom
 

Neue Beiträge

Zurück