Konrad-Adenauer-Gymnasium Langenfeld

Informatik Grundkurs Q1

JumpingBall Version 2

Unser Applet der Version 1 ruckelt allerdings ein wenig, da die Zeitdauern von Zeichnen und Abwarten nicht optimal abgestimmt werden können.

In der Version 2 werden wir nun unseren eigenen Thread definieren, der die Aufgabe hat, das Zeichnen und Bewegen des Applets zu starten.

Da Threads quasi parallel ablaufen, umgehen wir damit das Problem des unregelmässigen Neuzeichnens. Das Applet wird mit Hilfe von Threads dann immer in der selben Geschwindigkeit animiert und läuft flüssiger.

Die erste wichtige Änderung dazu ist, dass bei der Definition des Applets das Interface Runnable geladen werden muss:

public class JumpingBall2 extends Applet implements Runnable

Ausserdem benötigen wir eine Objektvariable vom Thread-Typ:

Thread Animation;

Die einzige Methode des Runnable-Interface heisst run(). Die Methode wird ausgeführt, wenn ein Thread dieser Klasse läuft.

Zuvor muss er allerdings erst mal erzeugt werden, wofür sich die start-Methode des Applets gut eignet:

public void start()
{
if (Animation == null)
{
Animation = new Thread(this);
Animation.start();
}
}

Zunächst wird überprüft, ob es noch kein Thread-Objekt gibt. Wenn nein, wird ein neues erzeugt. Wichtig ist hier der this-Operator, denn der sagt dem Thread-Objekt, das es die run-Methode der Applet-Klasse benutzen soll. Genau diese wird durch den Aufruf der start-Methode des Thread-Objekts ausgeführt.

Nun zur run-Methode:

public void run()
{
while (true)
{
try
{
Animation.sleep(40);
}
catch(Exception e) 
{
}
repaint();
}
}

Sie entspricht im wesentlichen dem zweiten Teil unserer paint-Methode aus JumpingBall1, allerdings eingebettet in eine Endlos-While-Schleife, damit die Animation unentwegt läuft.

Für das eigentliche Zeichnen ist nachwievor die paint-Methode verantwortlich, die allerdings hier auf die eigentlichen Zeichenbefehle verkürzt ist.

Damit der Thread beim Verkleinern oder Zumachen des Browserfensters wieder gestoppt und zurückgesetzt wird, sollten sie noch eine stop-Methode einführen:

public void stop()
{
if (Animation != null)
{
Animation = null;
}
}

Wenn es ein Thread-Objekt gibt, wird das Thread-Objekt wieder auf null gesetzt, damit beim nächsten Starten die start-Methode wieder funktioniert.

Kein Java-Browser


© Ralph-Erich Hildebrandt, 30. Juni 2004