Animationen

T

Tomate_Salat

Gast
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. :(
 
Zuletzt bearbeitet von einem Moderator:

André Uhres

Top Contributor
Erstmal eine Einführung: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
und ein Beispiel:
Java:
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);
    }
}
 
T

Tomate_Salat

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

André Uhres

Top Contributor
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)
 
T

Tomate_Salat

Gast
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 :p ). Bin jetzt so verfahren, dass ich sie einfach am Anfang der Animation ausblende.

Mit freundlichen Grüßen

Tomate_Salat
 

Oben