Timer in Applet?

Shadow66

Mitglied
Hi,
ich habe ein kleines Applet geschrieben und möchte nun einen Timer reinbauen, der das Applet nach zehn Sekunden quasi auf 0 setzt und eine Meldung mit der Score ausgeben lässt. Ich habe das mit "Timer" versucht, in eclipse klappt das auch, nur a) bring ich es nicht fertig, dass er die Punkte wieder auf 0 setzt, weil die Variable inner anderen Klasse steht und b) bekomm ich bei der Anwendung auf einer html seite eine fehlermeldung...

hat jemand eine idee, wie ich das hinkriegen könnte?

Gruß
shadow
 
nein. mit diesen informationen bekommen wir leider gar nichts hin.
etwas mehr informationen sind schon nötig, da es für deine problembeschreibung nahezu unendlich viele mögliche probleme und lösungen gibt.
zeig doch einfach deinen source wenn er nicht zu lang ist oder ein kleines reproduzierbares beispiel =)
 
okay daran hätt ich auch denken können ^^

bittesehr...(nebenbei: die funktion des countdowns ist bei dem skript jetzt weniger notwendig weil ichs umgeschriebn hab...ein timer der vorwärts zählt wäre jetz sinnvoller...)

Java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Rectangle extends Applet implements MouseListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	int xpos, ypos, rect1xco, rect1yco, rect1width, rect1height, rect2xco, rect2yco, rect2width, rect2height, 
	rect3xco, rect3yco, rect3width, rect3height, rect4xco, rect4yco, rect4width, rect4height, score = 0;
	int click = 0;
	Random rnd = new Random();
	Font font;
	
	public void init()
	{
		addMouseListener(this);
		
		font = new Font("Arial", Font.BOLD, 16);
	}
	
	public void paint(Graphics g)
	{
		rect1xco = rnd.nextInt(300)+40;
		rect1yco = rnd.nextInt(300)+40;
		rect1width = rnd.nextInt(30)+10;
		rect1height = rnd.nextInt(30)+2;
		rect2xco = rnd.nextInt(300)+40;
		rect2yco = rnd.nextInt(300)+40;
		rect2width = rnd.nextInt(30)+10;
		rect2height = rnd.nextInt(30)+2;
		rect3xco = rnd.nextInt(300)+40;
		rect3yco = rnd.nextInt(300)+40;
		rect3width = rnd.nextInt(30)+10;
		rect3height = rnd.nextInt(30)+2;
		rect4xco = rnd.nextInt(300)+40;
		rect4yco = rnd.nextInt(300)+40;
		rect4width = rnd.nextInt(30)+10;
		rect4height = rnd.nextInt(30)+2;
		
		g.setFont(font);
		setBackground(Color.BLUE);
		g.drawString("Klicken Sie auf das rote Viereck, um Punkte zu bekommen!", 20, 20);
		g.setColor(Color.red);
		g.fillRect(rect1xco, rect1yco, rect1width, rect1height);
		
		if(score>=9)
		{
			g.setColor(Color.black);
			g.fillRect(rect2xco, rect2yco, rect2width, rect2height);
		}
		
		if(score==9)
		{
			g.setColor(Color.black);
			g.drawString("Sie erreichen Level 2", 20, 40);
		}
		
		if(score>=19)
		{
			g.setColor(Color.pink);
			g.fillRect(rect3xco, rect3yco, rect3width, rect3height);
		}
		
		if(score==19)
		{
			g.setColor(Color.black);
			g.drawString("Sie erreichen Level 3", 20, 40);
		}
		
		if(score>=29)
		{
			g.setColor(Color.orange);
			g.fillRect(rect4xco, rect4yco, rect4width, rect4height);
		}
		
		if(score==29)
		{
			g.setColor(Color.black);
			g.drawString("Sie erreichen Level 4", 20, 40);
		}
		
		if(score==39)
		{
			g.setColor(Color.gray);
			g.fillRect(0, 0, 640, 640);
			g.setColor(Color.black);
			g.drawString("Fertig!", 20, 40);
			g.drawString("Ihre Zeit: ?!?", 20, 60);
			g.drawString("Klicken, um fortzufahren ...", 20, 100);
			score=0;
		}
		
		if(click==1)
		{
			score++;
			
			g.setColor(Color.black);
			g.drawString("Punkte: "+score, 20, 350);
		}
		else if(click==2)
		{
			score--;
			
			g.setColor(Color.black);
			g.drawString("Punkte: "+score, 20, 350);
		}
	}
	
	public void mouseClicked(MouseEvent me)
	{
		xpos = me.getX();
		ypos = me.getY();
		
		if (xpos > rect1xco && xpos < rect1xco+rect1width && ypos >rect1yco && ypos < rect1yco+rect1height)
		{
			click = 1;
		}
		else
		{
			click = 2;
		}
		
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}
 
2 mögliche lösungen für dein timerproblem:

Java:
java.util.Timer timerUtil = new java.util.Timer();
    timerUtil.scheduleAtFixedRate(new TimerTask()
    {
      @Override
      public void run()
      {
        System.out.println("util timer");
      }
    }, 0, 1000);

    javax.swing.Timer swingTimer = new javax.swing.Timer(1000, new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("swing timer");
      }
    });
    swingTimer.start();

zu problem a) solltest du dir selbst eine reset() methode oder sowas schreiben welche du dann aufrufst, müsstest selbst am besten wissen was genau du resetten willst.
zu problem b) solltest du die fehlermeldung posten.
 
hey danke schonmal für die hilfe auf jeden fall =)
habe das problem jetzt auf ein minimum reduziert: die zeit wird nur bei jedem klick aktualisiert...

hier nochmal das veränderte skript

Java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Rectangle extends Applet implements MouseListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	int xpos, ypos, rectxco, rectyco, rectwidth, rectheight, ovalxco, ovalyco, ovalwidth, ovalheight, 
	arcxco, arcyco, arcwidth, archeight, time, score = 0;
	
	int[] polycox = new int[4];
	int[] polycoy = new int[4];
	
	int click = 0;
	Random rnd = new Random();
	Font font;
	
	public void init()
	{
		addMouseListener(this);
		
		font = new Font("Arial", Font.BOLD, 16);
		
		java.util.Timer timerUtil = new java.util.Timer();
	    timerUtil.scheduleAtFixedRate(new TimerTask()
	    {
	      public void run()
	      {
	        time++;
	      }
	    }, 0, 1000);
	}
	
	public void paint(Graphics g)
	{
			rectxco = rnd.nextInt(300)+40;
			rectyco = rnd.nextInt(300)+40;
			rectwidth = rnd.nextInt(30)+10;
			rectheight = rnd.nextInt(30)+2;
			ovalxco = rnd.nextInt(300)+40;
			ovalyco = rnd.nextInt(300)+40;
			ovalwidth = rnd.nextInt(30)+10;
			ovalheight = rnd.nextInt(30)+2;
			arcxco = rnd.nextInt(300)+40;
			arcyco = rnd.nextInt(300)+40;
			arcwidth = rnd.nextInt(30)+10;
			archeight = rnd.nextInt(30)+2;
			
			for(int i=0; i<polycox.length; i++)
			{
				polycox[i] = rnd.nextInt(100)+1;
			}
			
			for(int j=0; j<polycoy.length; j++)
			{
				polycoy[j] = rnd.nextInt(100)+1;
			}
			
			g.setFont(font);
			setBackground(Color.BLUE);
			
			if(score>0)
			{
				g.drawString("Zeit ( mit jedem Klick aktualisiert ): "+time, 20, 370);
			}
			
			g.drawString("Klicken Sie auf das rote Viereck, um Punkte zu bekommen!", 20, 20);
			g.setColor(Color.red);
			g.fillRect(rectxco, rectyco, rectwidth, rectheight);
			
			if(score==0)
			{
				time = 0;
			}
			
			if(score>=9)
			{
				g.setColor(Color.red);
				g.fillOval(ovalxco, ovalyco, ovalwidth, ovalheight);
			}
			
			if(score==9)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 2", 20, 40);
			}
			
			if(score>=19)
			{
				g.setColor(Color.red);
				g.fillArc(arcxco, arcyco, arcwidth, archeight, 300, 300);
			}
			
			if(score==19)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 3", 20, 40);
			}
			
			if(score>=29)
			{
				g.setColor(Color.red);
				g.fillPolygon(polycox, polycoy, 4);
			}
			
			if(score==29)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 4", 20, 40);
			}
			
			if(score==39)
			{
				g.setColor(Color.gray);
				g.fillRect(0, 0, 640, 640);
				g.setColor(Color.black);
				g.drawString("Fertig!", 20, 40);
				g.drawString("Ihre Zeit: "+time+" Sekunden", 20, 60);
				g.drawString("Klicken, um fortzufahren ...", 20, 100);
				score=0;
			}
			
			if(click==1)
			{
				score++;
				
				g.setColor(Color.black);
				g.drawString("Punkte: "+score, 20, 350);
			}
			else if(click==2)
			{
				score--;
				
				g.setColor(Color.black);
				g.drawString("Punkte: "+score, 20, 350);
			}
	}
	
	public void mouseClicked(MouseEvent me)
	{
		xpos = me.getX();
		ypos = me.getY();
		
		if (xpos > rectxco && xpos < rectxco+rectwidth && ypos >rectyco && ypos < rectyco+rectheight)
		{
			click = 1;
		}
		else
		{
			click = 2;
		}
		
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

weiß jemand wie ich es hinbekomme, dass die zeit laufend aktualisiert wird??
 
Zuletzt bearbeitet:
edit: k was ich geschrieben hab, wurde eh schon erwähnt :X
Allerdings rat ich dir zum ActionListener. Dann bist nicht mausabhängig.
 
Zuletzt bearbeitet:
aaaalso habe das jetz so "gelöst" (mit einigen naja fehlern aber nich erheblich) die frage is nur ob man das auch eleganter hinbekommen kann!?

hier der code:

Java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class Rectangle extends Applet implements MouseListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	int xpos, ypos, rectxco, rectyco, rectwidth, rectheight, ovalxco, ovalyco, ovalwidth, ovalheight, 
	arcxco, arcyco, arcwidth, archeight, time, score = 0;
	
	int[] polycox = new int[4];
	int[] polycoy = new int[4];
	
	int click = 0;
	Random rnd = new Random();
	Font font;
	
	public void init()
	{
		addMouseListener(this);
		
		font = new Font("Arial", Font.BOLD, 16);
		
		java.util.Timer timerUtil = new java.util.Timer();
	    timerUtil.scheduleAtFixedRate(new TimerTask()
	    {
	      public void run()
	      {
	        time++;
	        
	        if(score>0 && score<40 && score!=1)
			{
				Graphics g = getGraphics();
				
				g.setFont(font);
				g.setColor(Color.blue);
				g.fillRect(55, 350, 40, 20);
				g.setColor(Color.black);
				g.drawString("Zeit: "+time, 20, 370);
			}
	      }
	    }, 0, 1000);
	}
	
	public void paint(Graphics g)
	{
		paint();
	}
	
	public void paint()
	{
			Graphics g = getGraphics();
			
			setBackground(Color.blue);
			g.drawString("Klicken Sie auf das rote Viereck, um Punkte zu bekommen!", 20, 20);
			g.setColor(Color.blue);
			g.fillRect(0, 0, 350, 350);
			
			rectxco = rnd.nextInt(200)+40;
			rectyco = rnd.nextInt(200)+40;
			rectwidth = rnd.nextInt(30)+10;
			rectheight = rnd.nextInt(30)+2;
			ovalxco = rnd.nextInt(200)+40;
			ovalyco = rnd.nextInt(200)+40;
			ovalwidth = rnd.nextInt(30)+10;
			ovalheight = rnd.nextInt(30)+2;
			arcxco = rnd.nextInt(200)+40;
			arcyco = rnd.nextInt(200)+40;
			arcwidth = rnd.nextInt(30)+10;
			archeight = rnd.nextInt(30)+2;
			
			for(int i=0; i<polycox.length; i++)
			{
				polycox[i] = rnd.nextInt(100)+1;
			}
			
			for(int j=0; j<polycoy.length; j++)
			{
				polycoy[j] = rnd.nextInt(100)+1;
			}
			
			g.setFont(font);
			g.setColor(Color.black);
			g.drawString("Klicken Sie auf das rote Viereck, um Punkte zu bekommen!", 20, 20);
			g.setColor(Color.red);
			g.fillRect(rectxco, rectyco, rectwidth, rectheight);
			
			if(score==0)
			{
				time = 0;
			}
			
			if(score>=9)
			{
				g.setColor(Color.red);
				g.fillOval(ovalxco, ovalyco, ovalwidth, ovalheight);
			}
			
			if(score==9)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 2", 20, 40);
			}
			
			if(score>=19)
			{
				g.setColor(Color.red);
				g.fillArc(arcxco, arcyco, arcwidth, archeight, 300, 300);
			}
			
			if(score==19)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 3", 20, 40);
			}
			
			if(score>=29)
			{
				g.setColor(Color.red);
				g.fillPolygon(polycox, polycoy, 4);
			}
			
			if(score==29)
			{
				g.setColor(Color.black);
				g.drawString("Sie erreichen Level 4", 20, 40);
			}
			
			if(score==39)
			{
				g.setColor(Color.gray);
				g.fillRect(0, 0, 640, 640);
				g.setColor(Color.black);
				g.drawString("Fertig!", 20, 40);
				g.drawString("Ihre Zeit: "+time+" Sekunden", 20, 60);
				g.drawString("Klicken, um fortzufahren ...", 20, 100);
				score=0;
			}
			
			if(click==1)
			{
				score++;
				
				g.setColor(Color.black);
				g.drawString("Punkte: "+score, 20, 350);
			}
			else if(click==2)
			{
				score--;
				
				g.setColor(Color.black);
				g.drawString("Punkte: "+score, 20, 350);
			}
	}
	
	public void mouseClicked(MouseEvent me)
	{
		xpos = me.getX();
		ypos = me.getY();
		
		if (xpos > rectxco && xpos < rectxco+rectwidth && ypos >rectyco && ypos < rectyco+rectheight)
		{
			click = 1;
		}
		else
		{
			click = 2;
		}
		
		paint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}
 
Die Frage ist, was du eleganter haben willst, bzw. wo überhaupt noch ein Problem ist.
Mir persönlich gefällt das Motto "never touch a running system".
Allerdings behaupt ich nach wie vor, dass du es mit jres ActionListener machen solltest und nicht auf die Mausklicks hören. Das geht mit dem utility.timer bestimmt auch ziemlich einfach, aber da hab ich ehrlich gesagt keine Erfahrung.
Vielleicht kann ich dein Problem sowieso nicht lösen, allerdings gibts hier im Forum genug Leute die dazu in der Lage wären, wenn du mehr Infos rausrückst.
 
okay was ich noch nicht elegant finde ist dass nicht die normale paint(Graphics g)-Methode genutzt wird sondern direkt an eine seperate mthode verwiesen wird, da ich ansonsten repaint verwenden müsste und dann wird die zeit selbst auch noch mal aktualisiert, also kurz aus und wieder eingeblendet, für alles andere wäre repaint aber wesentlich sauberer da ich dann nicht erst die alten quadrate etc. "übermalen" muss...
 
hey nochmal ich habs jetzt fast geschafft es noch "eleganter" zu machen...
ich bräuchte nur noch einmal kurz hilfe.
ich habe den timer jetzt in eine andere class gepackt die folglich "extends Thread" braucht. Ich möchte aber von dort aus in das applet reinschreiben, daher brauch ich auch "extends Applet"...wie bekomme ich das hin, dass die klasse um beides "extended" wird??? ich habs auf jede erdenkliche weise versucht (außer auf die richtige natürlich -.-)
 
ich habe den timer jetzt in eine andere class gepackt die folglich "extends Thread" braucht.
Nein braucht sie nicht implemente Runnable reicht und ist die übliche Vorgehensweise
Ich möchte aber von dort aus in das applet reinschreiben, daher brauch ich auch "extends Applet"...
Und nochmal: Nein. Was Du dort benötigst ist eine Referenz auf das Applet. Es Nutzt doch nichts wenn die "TimerKlasse" von Applet erbt, ausser sie selbst stellt das Applet.
 

Zurück
Oben