# Animationen



## Tomate_Salat (26. Jan 2010)

Hi,

ich bräuchte für mein aktuelles Projekt ein paar Animationen, welche ich gerne in Java selbst schreiben möchte. Zum Beispiel eine fade-Animation. Diese schreibe ich als Klasse (in Eclipse) vor, teste sie dort und implementiere sie dann in mein Programm(welches ich in Netbeans verwalte). Das Problem: bei meinen Tests funktioniert die Animation wunderbar und dort simuliere ich die gleichen Bedienungen wie im Programm, aber sobald ich später das ganze in Netbeans teste, hab ich ein hässliches Flakern in dem ganzen. Gut möglich das meine Technik falsch ist. 

Ich überschreibe dazu die [c]paintComponent(Graphics g);[/c] meines [c]JPanel[/c]. Bei einem fade-out lasse ich immer erst alle Komponenten entfernen, da sie vom faden nicht betroffen sind. Mir ist [c]Canvas[/c] bekannt, wo es wohl besser gehen sollte, dennoch weis ich nicht wie ich das hier verwenden könnte.

Ich hoffe Ihr könnt mir mit Tipps helfen. Die Animationsklasse ist über 350Zeilen lang und diese werden alle Benötigt und ich will euch jetzt auch nicht dazu nötigen, diese durchzuschauen.

Mit freundlichen Grüßen

Tomate_Salat

*Edit* Ach mist, kann das bitte jemand in die richtige Kategorie verschieben? Das sollte eigentl. nicht unter Hausaufgaben.


----------



## André Uhres (26. Jan 2010)

Erstmal eine Einführung: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
und ein Beispiel:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimerAnimation extends JLabel implements ActionListener {

    int deltaX = 2;
    int deltaY = 3;
    int directionX = 1;
    int directionY = 1;

    public TimerAnimation(
            int startX, int startY,
            int deltaX, int deltaY,
            int directionX, int directionY,
            int delay) {
        this.deltaX = deltaX;
        this.deltaY = deltaY;
        this.directionX = directionX;
        this.directionY = directionY;

        setBackground(Color.RED);
        setPreferredSize(new Dimension(20, 20));
        setOpaque(true);
        setSize(getPreferredSize());
        setLocation(startX, startY);
        new javax.swing.Timer(delay, this).start();
    }

    public void actionPerformed(ActionEvent e) {
        Container parent = getParent();

        //  Determine next X position

        int nextX = getLocation().x + (deltaX * directionX);

        if (nextX < 0) {
            nextX = 0;
            directionX *= -1;
        }

        if (nextX + getSize().width > parent.getSize().width) {
            nextX = parent.getSize().width - getSize().width;
            directionX *= -1;
        }

        //  Determine next Y position

        int nextY = getLocation().y + (deltaY * directionY);

        if (nextY < 0) {
            nextY = 0;
            directionY *= -1;
        }

        if (nextY + getSize().height > parent.getSize().height) {
            nextY = parent.getSize().height - getSize().height;
            directionY *= -1;
        }

        //  Move the label

        setLocation(nextX, nextY);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.getContentPane().add(new TimerAnimation(10, 10, 2, 3, 1, 1, 10));
        frame.getContentPane().add(new TimerAnimation(300, 100, 3, 2, -1, 1, 20));
        frame.getContentPane().add(new TimerAnimation(0, 200, 5, 0, 1, 1, 80));
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
```


----------



## Tomate_Salat (26. Jan 2010)

Danke für den Link, das beispiel hab ich mir mal angeschaut und sieht interessant aus. Den Text im Link habe ich noch nicht gelesen, werde mich aber gleich daran tun und melde mich dann hier wieder ;-)

*Edit* Ob es wirklich geholfen hat werde ich erst morgen erfahren. Gibt es eine Möglichkeit die Tranparentz der Childs zu ändern? Ich kann zwar [c]foreground();[/c] und [c]background();[/c] einfach verändern, aber dinge wie Ränder o.ä. bleiben da einfach stehen. 

*Edit2* Wunderschön, konnte die Animation so hinbekommen, dass es jetzt gut ausschaut  Ich bedanke mich nochmals recht herzlich für deinen Tipp ;-)

MFG

Tomate_Salat


----------



## André Uhres (27. Jan 2010)

Tomate_Salat hat gesagt.:


> Ob es wirklich geholfen hat werde ich erst morgen erfahren. Gibt es eine Möglichkeit die Tranparentz der Childs zu ändern? Ich kann zwar [c]foreground();[/c] und [c]background();[/c] einfach verändern, aber dinge wie Ränder o.ä. bleiben da einfach stehen.


_Wenn eine dahinter liegende Komponente durch den Randbereich einer Komponente durchscheinen soll -- das heißt, wenn der Rand Transparenz unterstützt indem isBorderOpaque() "false" zurückgibt (z.B. EmptyBorder oder LineBorder mit roundedCorners) -- dann, muß die Komponente sich selbst auch als nicht opaque definieren und sicherstellen dass sie den Randbereich nicht übermalt._ (Siehe Malen in AWT und Swing - Byte-Welt Wiki)


----------



## Tomate_Salat (27. Jan 2010)

Transparenz in Java ist echt mühsam...Hoffe das wird sich irgendwann mal ändern. Ich hab mir deine Antwort mal gespeichert, vielleicht brauche ich die Transparenz bei den childs doch nicht (hoffe es mal  ). Bin jetzt so verfahren, dass ich sie einfach am Anfang der Animation ausblende. 

Mit freundlichen Grüßen

Tomate_Salat


----------

