for Schleife unterbrechen und auf Mausklick warten

AnjaLina

Grünschnabel
Hallo!

Ich versuche eine for-Schleife zu unterbrechen bis mit der Maus geklickt wird.

Es geht darum 3000 Punkte zu zeichnen. Nach je ca. 500 würde ich gerne eine Pause haben um das Bild angucken zu können. Danach soll weiter gezeichnet werden.

Vielleicht kann mir einer von euch helfen.

Viele Grüße,
Anja-Lina.

Code:
import java.awt.*;

public class dreieck extends java.applet.Applet{
	int x = 1;
	int y = 1;
	
	public void paint(Graphics g) {
		g.fillOval(51,248,2,2);
		g.fillOval(447,248,2,2);
		g.fillOval(249,50,2,2);
		g.setColor(Color.black);
		
		int i;
		double abc;

		g.setColor(Color.black);
		g.fillRect(x,y, 2,2);
		g.setColor(Color.black);

		for (i=0;i<3000;i++) {
			abc = (Math.random()*3);
			if(abc<1) {
				x=(x+50)/2;
				y=(y+250)/2;
				g.fillOval(x,y, 2,2);
			}
			else if(abc<2) {
				x=(x+450)/2;
				y=(y+250)/2;
				g.fillOval(x,y, 2,2);
			}
			else {
				x=(x+250)/2;
				y=(y+50)/2;
				g.fillOval(x,y, 2,2);
			}
		}
	}
}
 
Hallo!

Hier hab ich mal ein kleines Beispiel erstellt:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JApplet;

/*
 * Created on 02.06.2004
 */

/**
 * @author Administrator
 */
public class MyApplet extends JApplet {

	private volatile boolean stopped = false;

	private BufferedImage image;
	private Graphics2D g2d;
	private Graphics gScreen;

	private int x = 160;
	private int y = 120;

	private int maxRadius = 100;
	private int radius;

	private Thread thread = new Thread() {

		{
			setPriority(Thread.MIN_PRIORITY);
		}
			
		public void run() {
			try {
				while (true) {
					while (stopped) {
						Thread.sleep(250l);
						gScreen.drawImage(image, 0, 0, null);
					}
					while (!stopped) {
						// Die Zeichenarbeit wird hier erledigt...
						Thread.sleep(25l);

						g2d.clearRect(0, 0, 320, 240);

						radius = (radius + 2 ) % maxRadius;
						
						g2d.setColor(Color.RED);
						g2d.fillOval(x-radius/2, y-radius/2, radius, radius);
				
						gScreen.drawImage(image, 0, 0, null);
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	};

	public void init() {
		setSize(320, 240);
		getContentPane().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				//Applet anhalten ...
				stopped = !stopped;
			}
		});
	}

	public void start() {
		image = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);
		g2d = (Graphics2D) image.getGraphics();
		gScreen = getContentPane().getGraphics();
		thread.start();

	}
}

Die Zeichenarbeit übernimmt ein eigener Thread, der bei Mausklick einfach schlafen gelegt wird.

Gruß Tom
 
Hallo Tom!

Vielen Dank! Das ist genau das was ich suchte. :)

Kann ich das Zeichnen auch nach einem Durchgang abbrechen?

Liebe Grüße,
Anja-Lina.
 
Hallo!

Ja und zwar ganz einfach ...

setzt einfach:

Code:
stopped = true;
ans Ende der while-Schleife welche die Zeichenarbeit übernimmt...
dann hällt die Animation nach jedem Schritt an. Mit einem Mausklick kannst du dann wieder einen "Frame" weiter klicken.

Gruß tom
 
Hallo Tom,

und langsamer zeichen? Ich komme in meiner for Schleife gar nicht so schnell zu klicken.


Anja-Lina.
 
Mit dem Befehl "sleep(millisec)" legst du den Thread für die angegebene Zeit schlafen.
Tom hat schon diverse "sleep"s eingebaut. Verändere die Werte einfach an den entsprechenden Stellen und er setzt z.B. die Punkte langsamer.
 
Danke, Gorcky.
Das Problem war meine for-Schleife. Ich habe sie jetzt weggelassen und stattdessen die vorhandene while-Schleife benutzt.

Viele Grüße,
Anja-Lina.
 

Neue Beiträge

Zurück