Swing Animation mit JLayeredPane?

renwal

Aktives Mitglied
Hallo!

Für meine Lernplattform versuche ich mich gerade am Animieren von Swing-Elementen. Momentan bin ich soweit, dass ich eine JLayeredPane habe, die ich um einige Methoden zum Animieren der Komponenten erweitert habe, sowie eine Thread-Subclass fürs Ausführen der Animation. Ziel soll sein, eine Komponente von einer der 4 Seiten ins Bild zu schieben, und das möglichst ruckelfrei. Aktuell funktioniert das Einblenden auch, aber die Zeiten stimmen nicht, das ganze dauert etwa 8 Sekunden, wenn ich auf 1000ms stelle und ruckelt wie sonstwas.

Hier der Quellcode der JLayeredPane (JAnimLayeredPane.java)

Java:
package componentLib;

import java.awt.Component;

import javax.swing.JLayeredPane;

import threads.Animation;

/**
 * Subclass der JLayeredPane mit Animationsmöglichkeiten für Komponenten von den
 * 4 Seiten der Komponente aus
 * 
 * Funktionsweise: Der Layer 0 enthält alle Komponenten, bis auf die aktuelle
 * (diese befindet sich auf Layer 1). Diese sind jedoch alle unsichtbar. Wird
 * die oberste Komponente neu gesetzt, so wird die alte oberste Komponente auf
 * den Layer 0 gesetzt, die neue auf 1, jedoch außerhalb der Anzeigefläche. Dann
 * startet die Animation, die die Komponente fließend in den Anzeigebereich
 * schiebt. Anschließend wird die auf Layer 0 gesetzte Komponente, da sie jetzt
 * von der animierten Komponente überlagert wird, unsichtbar gemacht.
 * 
 * @author renwal
 * @version 1.0.0
 * 
 */
public class JAnimLayeredPane extends JLayeredPane {

    // Konstanten für die Animationsrichtung
    public static final int ANIMATION_DIRECTION_TOP = Animation.ANIMATION_DIRECTION_TOP;
    public static final int ANIMATION_DIRECTION_BOTTOM = Animation.ANIMATION_DIRECTION_BOTTOM;
    public static final int ANIMATION_DIRECTION_LEFT = Animation.ANIMATION_DIRECTION_LEFT;
    public static final int ANIMATION_DIRECTION_RIGHT = Animation.ANIMATION_DIRECTION_RIGHT;

    // Die momentan oberste Komponente
    private Component topmostComponent;

    private static final long serialVersionUID = 4551703726681564670L;

    public JAnimLayeredPane()
    {
	// Neue Instanz der JAnimLayeredPane erzeugen
	super();
    }

    /**
     * Methode zum Einstellen der obersten Komponente
     * 
     * @param component
     *            Die Komponente, die als oberste Komponente definiert wird
     */
    private void setTopmostComponent(Component component)
    {
	if (topmostComponent != null)
	    // Zusätzliche Schritte, wenn bereits eine Komponente "topmost" ist

	    // Die Komponente auf die unterste Ebene setzen
	    setLayer(topmostComponent, 0);
	
	// Die neue Komponente "nach vorn holen" und einblenden
	setLayer(component, 1);
	component.setVisible(true);
	// Die neue oberste Komponente setzen
	topmostComponent = component;
    }

    /**
     * Methode zum Einblenden der neuen obersten Komponente
     * 
     * 
     * @param component
     *            Die neue oberste Komponente
     * @param animation
     *            Die Animationsrichtung
     * @param speed
     *            Die Dauer der Animation in ms
     */
    public void animatedShowComponent(Component component, int animation,
	    int speed)
    {
	// Parameter auf Korrektheit prüfen
	if (component == null)
	    throw new NullPointerException();
	if (animation < 1 || animation > 4)
	    throw new IllegalArgumentException("Unknown animation direction: "
		    + animation);

	// Start- und Zielpunkt einstellen
	final int to = 0;
	final int from = -component.getHeight();
	// Neue oberste Komponente dorthin schieben (dann befindet sie
	// sich vollständig außerhalb des Anzeigebereiches
	component.setLocation(0, from);
	// Je nach Animationsrichtung einstellen, ob die Komponente an der
	// x-Achse oder an der y-Achse "entlanggeschoben" werden soll
	final int track = animation == ANIMATION_DIRECTION_BOTTOM
		|| animation == ANIMATION_DIRECTION_TOP ? component.getX()
		: component.getY();
	// Alte oberste Komponente merken
	final Component oldTopmost = topmostComponent;
	// Neue oberste Komponente auf den oberen Layer setzen
	setTopmostComponent(component);
	// Animation starten
	new Animation(component, oldTopmost, animation, speed, from, to, track)
		.start();
    }

    @Override
    public Component add(Component component)
    {
	// Überschriebene superclass-Methode für das Hinzufügen von
	// Komponenten, um dafür zu sorgen, dass Komponenten nach
	// dem Hinzufügen immer invisible sind.
	final Component returnComponent = super.add(component);
	component.setVisible(false);
	return returnComponent;
    }

}

Und hier der Quellcode der Animation (Animation.java)

Java:
package threads;

import java.awt.Component;

/**
 * Subclass von Thread zur Ausführung einer Animation einer Komponente
 * 
 * @author Rene
 * @version 1.0.0
 */
public class Animation extends Thread {

    // Konstanten für die Animationsrichtung
    public static final int ANIMATION_DIRECTION_TOP = 1;
    public static final int ANIMATION_DIRECTION_BOTTOM = 2;
    public static final int ANIMATION_DIRECTION_LEFT = 3;
    public static final int ANIMATION_DIRECTION_RIGHT = 4;

    Component component;
    Component underlayingComponent;
    int animation;
    int speed;
    int from;
    int to;
    int track;

    /**
     * 
     * @param component
     *            Die zu animierende Komponente
     * @param underlayingComponent
     *            Die Komponente, die von der Animation später verdeckt wird und
     *            dann ausgeblendet werden kann
     * @param animation
     *            Die Animationsrichtung
     * @param speed
     *            Die Animationsdauer in ms
     * @param from
     *            Der Startpunkt der Animation
     * @param to
     *            Der Zielpunkt der Animation
     * @param track
     *            Der Punkt auf der (je nach Animationsrichtung) x- oder
     *            y-Achse, an dem die Komponente "entlanggeschoben" wird
     */
    public Animation(Component component, Component underlayingComponent,
	    int animation, int speed, int from, int to, int track)
    {
	// Neue Instanz der Animations-Klasse erzeugen
	super();
	// Parameter auf Korrektheit prüfen
	if (to - from <= 0)
	    throw new IllegalArgumentException(
		    "to - from has to be greater than 0!");
	if (speed == 0)
	    throw new IllegalArgumentException("speed must not be 0");
	// Parameter übernehmen
	this.component = component;
	this.underlayingComponent = underlayingComponent;
	this.animation = animation;
	this.speed = speed;
	this.from = from;
	this.to = to;
	this.track = track;
    }

    @Override
    public void run()
    {
	// Pausenzeit berechnen
	final int pause = speed / (to - from);
	System.out.println("speed:" + speed + "; pixels: " + (to - from)
		+ "; pause: " + pause);
	// Aktuellen Punkt mit Startpunkt vordefinieren
	int now = from;
	// Je nach Animationsrichtung die Komponente per Schleife an
	// ihre neue Position verschieben
	if (animation == ANIMATION_DIRECTION_BOTTOM)
	    while (now < to)
	    {
		now++;
		component.setLocation(track, now);
		try
		{
		    Thread.sleep(pause);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	else if (animation == ANIMATION_DIRECTION_TOP)
	    while (now > to)
	    {
		now--;
		component.setLocation(track, now);
		try
		{
		    Thread.sleep(pause);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	else if (animation == ANIMATION_DIRECTION_RIGHT)
	    while (now < to)
	    {
		now++;
		component.setLocation(now, track);
		try
		{
		    Thread.sleep(pause);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	else if (animation == ANIMATION_DIRECTION_LEFT)
	    while (now > to)
	    {
		now--;
		component.setLocation(now, track);
		try
		{
		    Thread.sleep(pause);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	else
	    // Wenn als Animationsrichtung keine der 4 verfügbaren angegeben
	    // wurde
	    throw new IllegalArgumentException(
		    "unknown animation direction parameter");
	// Wenn eine Komponente als unter der Animation liegend angegeben
	// wurde, diese ausblenden, weil sie jetzt sowieso von der animierten
	// Komponente verdeckt wird
	if (underlayingComponent != null)
	    underlayingComponent.setVisible(false);

    }

}

Wäre toll, wenn ihr mir sagen könntet, was ich anders machen muss.

Danke!
 

AmunRa

Gesperrter Benutzer
die Berechnung der Pause ist einfach falsch,

ich hab nur nicht ganz verstanden was du da berechnest,

kannst du das bitte erklären?
 

renwal

Aktives Mitglied
Hä? Das verstehe ich jetzt nicht. Ich habe doch einen Startpunkt, einen Zielpunkt und die Dauer des Ganzen. Dann rechne ich mir mit (to-from) die Anzahl an Pixeln aus, die zurückgelegt werden müssen.
Dann muss das Programm rausbekommen, wie lange es nach jedem px warten muss, damit es die Strecke (to-from) in der gesamten Zeit zurücklegt. (OK, wir gehen jetzt mal davon aus, dass nie mehr als 1px pro ms gebraucht wird, sonst klappt das natürlich nicht. Wird noch geändert)

Warum soll ich dann die Strecke von der Gesamtzeit abziehen? Das eine sind doch px, das andere ms.
 

AmunRa

Gesperrter Benutzer
Sorry hab da zuvor wirklich etwas falsch verstanden,

kannst du mal ein KSKB erstellen in dem man sieht, wo das Problem bei dir liegt?


Edit: was für einen Wert erhältst du eigentlich für die errechnete Pause, klingt dieser korrekt?
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
final int pause = speed / (to - from);

Geschwindigkeit = Weg/Zeit
Zeit=Weg/Geschwindigkeit
Weg=Zeit*Geschwindigkeit

Geschwindigkeit/Weg = Weg/Zeit/Weg

Wenn du Geschwindigkeit/Weg rechnest, kommt da irgendwas ohne Zusammenhang raus. Eventuell eine Beschleunigung oder sowas. Du versuchst irgendwie auszurechnen, wie viel Zeit es braucht, eine Wegeinheit zurückzulegen, das ist aber völlig irrelevant. Du solltest einfach ein konstantes Delay verwenden und jedesmal die Position berechnen.
 

renwal

Aktives Mitglied
Entweder verstehe ich deinen Post nicht oder ich hab einen großen Denkfehler in meinem Programm oder (nicht bös gemeint!!) du verstehst mein Programm nicht.
Gut, das kann auch an meiner Formulierungsweise liegen. "speed" bzw. die Geschwindigkeit ist einfach nur die Anzahl an ms, die die Animation im Ganzen dauert. "duration" wäre also als Variablennamen angebrachter.

Was ich ausrechne, sind die Millisekunden pro Pixel auf dem Bildschirm, das heißt es müssen nach 1px X Millisekunden gewartet werden, damit die Dauer eingehalten werden kann.

Bezüglich dem KSKB: Muss ich jetzt wirklich eine Kopie meines Programms so klein machen, dass es sich fast nur noch um den Problemcode handelt oder reicht es aus, wenn ich ein neues Projekt mit einem Frame und dann der animierbaren JAnimLayeredPane erstelle? Das Programm ist so dermaßen komplex, dass das mit den ganzen init-Routinen sonst Tage dauern könnte...
 

bERt0r

Top Contributor
Ja, Geschwindigkeit und Dauer ist was anderes.

Was ich ausrechne, sind die Millisekunden pro Pixel auf dem Bildschirm, das heißt es müssen nach 1px X Millisekunden gewartet werden, damit die Dauer eingehalten werden kann.
Genau das habe ich aber erwartet was du versuchst, und es macht doch gar keinen Sinn:
Du willst anscheinend dass nach jedem Pixen neu gezeichnet wird:
Wenn du 1000 ms als Zeit und 100 px als Distanz hast, ergibt das 10 ms pro pixel. ABER das heisst auch dass du 100 mal neu Zeichnest, und ob jedes mal Zeichnen in 10 ms fertig ist, kannst du gar nicht wissen (nachdems länger dauert wirds wohl nicht so sein). Musst du unbedingt 100 Frames per Second erreichen? Das Menschliche Auge merkt ab ca 30 keinen Unterschied mehr (vielleicht entwickelst du ja für Fliegen :D *Scherz*).
Da wäre es doch besser zu sagen, dein Thread rechnet alle 25 ms die Position neu aus, und wenn sie sich verändert hat, zeichnest du neu.
 

renwal

Aktives Mitglied
Sorry, dass ich euch so lange habe warten lassen! :oops:
Mit dem Tipp hab ich es jetzt hinbekommen. Ich hab den Quellcode gerade nicht hier, werde den aber demnächst auch noch hochladen.
 

renwal

Aktives Mitglied
So, hier ist der neue Quellcode:

JAnimLayeredPane.java
Java:
package componentLib;

import java.awt.Component;
import java.beans.Beans;

import javax.swing.JLayeredPane;

import threads.Animation;

/**
 * Subclass der JLayeredPane mit Animationsmöglichkeiten für Komponenten von den
 * 4 Seiten der Komponente aus
 * 
 * Funktionsweise: Der Layer 0 enthält alle Komponenten, bis auf die aktuelle
 * (diese befindet sich auf Layer 1). Diese sind jedoch alle unsichtbar. Wird
 * die oberste Komponente neu gesetzt, so wird die alte oberste Komponente auf
 * den Layer 0 gesetzt, die neue auf 1, jedoch außerhalb der Anzeigefläche. Dann
 * startet die Animation, die die Komponente fließend in den Anzeigebereich
 * schiebt. Anschließend wird die auf Layer 0 gesetzte Komponente, da sie jetzt
 * von der animierten Komponente überlagert wird, unsichtbar gemacht.
 * 
 * @author renwal
 * @version 1.2.1
 * 
 */
public class JAnimLayeredPane extends JLayeredPane {

    // Konstanten für die Animationsrichtung
    public static final int ANIMATION_DIRECTION_TOP = Animation.ANIMATION_DIRECTION_TOP;
    public static final int ANIMATION_DIRECTION_BOTTOM = Animation.ANIMATION_DIRECTION_BOTTOM;
    public static final int ANIMATION_DIRECTION_LEFT = Animation.ANIMATION_DIRECTION_LEFT;
    public static final int ANIMATION_DIRECTION_RIGHT = Animation.ANIMATION_DIRECTION_RIGHT;
    public static final boolean ANIMATION_NORMAL = Animation.ANIMATION_NORMAL;
    public static final boolean ANIMATION_REVERSE = Animation.ANIMATION_REVERSE;

    // Die momentan oberste Komponente
    private Component topmostComponent;
    // Die sich momentan unter der obersten Komponente
    // befindliche Komponente
    private Component underlayingComponent;

    private static final long serialVersionUID = 4551703726681564670L;

    public JAnimLayeredPane()
    {
	// Neue Instanz der JAnimLayeredPane erzeugen
	super();
    }

    /**
     * Methode zum Einstellen der obersten Komponente
     * 
     * @param component
     *            Die Komponente, die als oberste Komponente definiert wird
     */
    private void setTopmostComponent(Component component)
    {
	if (topmostComponent != null)
	    // Zusätzliche Schritte, wenn bereits eine Komponente "topmost" ist

	    // Die Komponente auf die unterste Ebene setzen
	    setLayer(topmostComponent, 0);

	// Die neue Komponente "nach vorn holen" und einblenden
	setLayer(component, 1);
	component.setVisible(true);
	// Die neue oberste Komponente setzen
	topmostComponent = component;
    }

    /**
     * Methode zum Einstellen der sich unter der Topmost- Komponente
     * befindlichen Komponente
     * 
     * @param component
     *            Die Komponente, die unter der Topmost- Komponente eingeblendet
     *            wird
     */
    private void setUnderlayingComponent(Component component)
    {
	if (component == null)
	{
	    underlayingComponent.setVisible(false);
	    underlayingComponent = null;
	}
	else
	{
	    if (underlayingComponent != null)
		underlayingComponent.setVisible(false);
	    setLayer(component, 0);
	    component.setVisible(true);
	    underlayingComponent = component;
	}
    }

    /**
     * Methode zum Einblenden der neuen obersten Komponente
     * 
     * 
     * @param component
     *            Die neue oberste Komponente
     * @param animation
     *            Die Animationsrichtung
     * @param speed
     *            Die Dauer der Animation in ms
     */
    public void animatedShowComponent(Component component, int animation,
	    int speed, boolean reverse)
    {
	// Parameter auf Korrektheit prüfen
	if (component == null)
	    throw new NullPointerException();
	if (animation < 1 || animation > 4)
	    throw new IllegalArgumentException("Unknown animation direction: "
		    + animation);

	if (!reverse)
	{
	    // Die Komponente der letzen reverse-Animation ausblenden
	    if (underlayingComponent != null)
		setUnderlayingComponent(null);
	    // Start- und Zielpunkt einstellen
	    final int to = 0;
	    // Je nach Animationsrichtung Startpunkt oben oder unten
	    // außerhalb der Anzeigefläche platzieren
	    final int from = animation == ANIMATION_DIRECTION_TOP
		    || animation == ANIMATION_DIRECTION_LEFT ? component
		    .getHeight() : -component.getHeight();
	    if (to != from)
	    {
		// Animation nur starten, wenn die Komponente auch bewegt werden
		// muss

		// Neue oberste Komponente dorthin schieben (dann befindet sie
		// sich vollständig außerhalb des Anzeigebereiches
		component.setLocation(0, from);
		// Je nach Animationsrichtung einstellen, ob die Komponente an
		// der
		// x-Achse oder an der y-Achse "entlanggeschoben" werden soll
		final int track = animation == ANIMATION_DIRECTION_BOTTOM
			|| animation == ANIMATION_DIRECTION_TOP ? component
			.getX() : component.getY();
		// Alte oberste Komponente merken
		final Component oldTopmost = topmostComponent;
		// Neue oberste Komponente auf den oberen Layer setzen
		setTopmostComponent(component);
		// Animation starten
		new Animation(component, oldTopmost, animation, speed, from,
			to, track, false).start();
	    }
	}
	else
	{
	    // Start- und Zielpunkt einstellen
	    // Je nach Animationsrichtung Zielpunkt oben oder unten
	    // außerhalb der Anzeigefläche platzieren
	    final int to = animation == ANIMATION_DIRECTION_TOP
		    || animation == ANIMATION_DIRECTION_LEFT ? -component
		    .getHeight() : component.getHeight();
	    final int from = component.getX();
	    if (to != from)
	    {
		// Animation nur starten, wenn die Komponente auch bewegt werden
		// muss

		// Je nach Animationsrichtung einstellen, ob die Komponente an
		// der
		// x-Achse oder an der y-Achse "entlanggeschoben" werden soll
		final int track = animation == ANIMATION_DIRECTION_BOTTOM
			|| animation == ANIMATION_DIRECTION_TOP ? component
			.getX() : component.getY();
		// Die neue Komponente als sich unter der Topmost-Komponente
		// befindlich einstellen.
		setUnderlayingComponent(component);
		// Animation starten
		new Animation(topmostComponent, component, animation, speed,
			from, to, track, true).start();
		// HACK(!) um dafür zu sorgen, dass die Komponente bei
		// der nächsten Animation wieder korrekt ausgeblendet wird.
		topmostComponent = component;
	    }
	}
    }

    /**
     * Fügt eine neue Komponente zur JAnimLayeredPane hinzu
     * 
     * @param component
     *            Die Komponente, die hinzugefügt werden soll
     * 
     * @return Die hinzugefügte Komponente (Vorgabe aus der superclass)
     * 
     */
    @Override
    public Component add(Component component)
    {
	// Überschriebene superclass-Methode für das Hinzufügen von
	// Komponenten, um dafür zu sorgen, dass Komponenten nach
	// dem Hinzufügen immer invisible sind.
	final Component returnComponent = super.add(component);
	// Neue Komponenten nicht ausblenden, wenn der Visual Editor läuft,
	// damit sie noch bearbeitet werden können
	if (!Beans.isDesignTime())
	    component.setVisible(false);
	return returnComponent;
    }

    /**
     * Gibt die oberste Komponente zurück
     * 
     * @return Die oberste Komponente
     */
    public Component getTopmostComponent()
    {
	return topmostComponent;
    }

}

Animation.java
Java:
package threads;

import java.awt.Component;

/**
 * Subclass von Thread zur Ausführung einer Animation einer Komponente
 * 
 * @author Rene
 * @version 1.2.0
 */
public class Animation extends Thread {

    // Konstanten für die Animationsrichtung
    public static final int ANIMATION_DIRECTION_TOP = 1;
    public static final int ANIMATION_DIRECTION_BOTTOM = 2;
    public static final int ANIMATION_DIRECTION_LEFT = 3;
    public static final int ANIMATION_DIRECTION_RIGHT = 4;
    public static final boolean ANIMATION_NORMAL = false;
    public static final boolean ANIMATION_REVERSE = true;
    private static final int MS_PER_FRAME = 25;

    Component component;
    Component underlayingComponent;
    int animation;
    int speed;
    int from;
    int to;
    int track;
    boolean reverse;

    /**
     * 
     * @param component
     *            Die zu animierende Komponente
     * @param underlayingComponent
     *            Die Komponente, die von der Animation später verdeckt wird und
     *            dann ausgeblendet werden kann
     * @param animation
     *            Die Animationsrichtung
     * @param speed
     *            Die Animationsdauer in ms
     * @param from
     *            Der Startpunkt der Animation
     * @param to
     *            Der Zielpunkt der Animation
     * @param track
     *            Der Punkt auf der (je nach Animationsrichtung) x- oder
     *            y-Achse, an dem die Komponente "entlanggeschoben" wird
     * @param reverse
     *            Ob die Animation eine Einblendung (false) ode eine Ausblendung
     *            (true) ist
     */
    public Animation(Component component, Component underlayingComponent,
	    int animation, int speed, int from, int to, int track,
	    boolean reverse)
    {
	// Neue Instanz der Animations-Klasse erzeugen
	super();
	// Parameter auf Korrektheit prüfen

	// FIXME ANPASSEN AN ANIMATIONSRICHTUNGEN!!!

	if (to - from <= 0
		&& (animation == ANIMATION_DIRECTION_BOTTOM || animation == ANIMATION_DIRECTION_RIGHT))
	    throw new IllegalArgumentException(
		    "to - from has to be greater than 0 if the animation direction"
			    + " is BOTTOM or RIGHT! Value is " + (to - from)
			    + ".");
	else if (to - from >= 0
		&& (animation == ANIMATION_DIRECTION_TOP || animation == ANIMATION_DIRECTION_LEFT))
	    throw new IllegalArgumentException(
		    "to - from has to be less than 0 if the animation direction"
			    + " is TOP or LEFT! Value is " + (to - from) + ".");
	if (speed == 0)
	    throw new IllegalArgumentException("speed must not be 0");
	// Parameter übernehmen
	this.component = component;
	this.underlayingComponent = underlayingComponent;
	this.animation = animation;
	this.speed = speed;
	this.from = from;
	this.to = to;
	this.track = track;
	this.reverse = reverse;
    }

    @Override
    public void run()
    {
	// aktuelle Position setzen
	int position = from;

	// Je nach Animationsrichtung die entsprechende Animation starten
	if (animation == ANIMATION_DIRECTION_TOP)
	{
	    for (int repeat = 0; position > to; repeat++)
	    {
		// HINWEIS: Alle Kommentare hier gelten auch für die
		// folgenden drei Animationen

		// Startzeit für Zeitausgleich speichern
		final long timeNow = System.currentTimeMillis();
		// Neue Position berechnen und setzen
		position = from - repeat
			* (Math.abs(to - from) / (speed / MS_PER_FRAME));
		component.setLocation(track, position);
		try
		{
		    // Zeitausgleich berechnen (Die vorgegebene Anzahl an ms
		    // minus
		    // die für das Rendern benötigte Zeit)
		    final long substrSleepTime = System.currentTimeMillis()
			    - timeNow;
		    // Zeitausgleich, wenn die benötigte Zeit nicht länger ist
		    // als die Soll-Zeit, um Animationsgeschwindigkeit konstant
		    // zu halten.
		    if (substrSleepTime < MS_PER_FRAME)
			Thread.sleep(MS_PER_FRAME - substrSleepTime);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	    component.setLocation(track, to);
	}
	else if (animation == ANIMATION_DIRECTION_BOTTOM)
	{
	    for (int repeat = 0; position < to; repeat++)
	    {
		final long timeNow = System.currentTimeMillis();
		position = from + repeat
			* (Math.abs(to - from) / (speed / MS_PER_FRAME));
		component.setLocation(track, position);
		try
		{
		    final long substrSleepTime = System.currentTimeMillis()
			    - timeNow;
		    if (substrSleepTime < MS_PER_FRAME)
			Thread.sleep(MS_PER_FRAME - substrSleepTime);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	    component.setLocation(track, to);
	}
	else if (animation == ANIMATION_DIRECTION_LEFT)
	{
	    for (int repeat = 0; position < to; repeat++)
	    {
		final long timeNow = System.currentTimeMillis();
		position = from - repeat
			* (Math.abs(to - from) / (speed / MS_PER_FRAME));
		component.setLocation(position, track);
		try
		{
		    final long substrSleepTime = System.currentTimeMillis()
			    - timeNow;
		    if (substrSleepTime < MS_PER_FRAME)
			Thread.sleep(MS_PER_FRAME - substrSleepTime);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	    component.setLocation(to, track);
	}
	else if (animation == ANIMATION_DIRECTION_RIGHT)
	{
	    for (int repeat = 0; position > to; repeat++)
	    {
		final long timeNow = System.currentTimeMillis();
		position = from + repeat
			* (Math.abs(to - from) / (speed / MS_PER_FRAME));
		component.setLocation(position, track);
		try
		{
		    final long substrSleepTime = System.currentTimeMillis()
			    - timeNow;
		    if (substrSleepTime < MS_PER_FRAME)
			Thread.sleep(MS_PER_FRAME - substrSleepTime);
		}
		catch (final InterruptedException interrupt)
		{
		    interrupt();
		    break;
		}
	    }
	    component.setLocation(to, track);
	}
	else
	    // Wenn als Animationsrichtung keine der 4 verfügbaren angegeben
	    // wurde
	    throw new IllegalArgumentException(
		    "unknown animation direction parameter");
	// Wenn eine Komponente als unter der Animation liegend angegeben
	// wurde, diese ausblenden, weil sie jetzt sowieso von der animierten
	// Komponente verdeckt wird
	if (reverse)
	    component.setVisible(false);
	else if (underlayingComponent != null)
	    underlayingComponent.setVisible(false);
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
S Animation korrekt darstellen AWT, Swing, JavaFX & SWT 8
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
S Swing JLayeredPane Anordnung funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing JLayeredPane "Phänomen"? AWT, Swing, JavaFX & SWT 7
E Swing JPanel in JLayeredPane animieren AWT, Swing, JavaFX & SWT 7
T JLayeredPane in JScrollBox AWT, Swing, JavaFX & SWT 2
GUI-Programmer Swing Problem mit JLayeredPane AWT, Swing, JavaFX & SWT 2
M JLayeredPane mit JPanel im Vordergrund, Hintergrundelemente sperren AWT, Swing, JavaFX & SWT 7
G JPanel in JLayeredPane AWT, Swing, JavaFX & SWT 8
D Probleme mit MouseWheelListener und JLayeredPane in Applet AWT, Swing, JavaFX & SWT 2
G Swing JLayeredPane Schach AWT, Swing, JavaFX & SWT 7
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
R JLayeredPane - JPanel mit variabler Form AWT, Swing, JavaFX & SWT 4
J Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund AWT, Swing, JavaFX & SWT 5
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
R Swing JLayeredPane - Wie JScrollPane einbauen? AWT, Swing, JavaFX & SWT 17
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
H Button auf Bild/ JLayeredPane in Jpanel AWT, Swing, JavaFX & SWT 15
G JLayeredPane moveToFront funktioniert nicht AWT, Swing, JavaFX & SWT 15
D jLayeredPane Ebenen mit dynamischer Größe AWT, Swing, JavaFX & SWT 2
B Ärger mit JLayeredPane :-( AWT, Swing, JavaFX & SWT 5
S JLayeredPane AWT, Swing, JavaFX & SWT 16
M JLayeredPane : Applet - Application AWT, Swing, JavaFX & SWT 4
V JLayeredPane wird nur 1x bezeichnet AWT, Swing, JavaFX & SWT 12
shiny_hair JLayeredPane - Wie funktioniert das mit den Layern? AWT, Swing, JavaFX & SWT 2
T JLayeredPane Problem - AWT und SWING Komponente AWT, Swing, JavaFX & SWT 6
M Scrollbare JLayeredPane AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben