Repaint pour faire défiler un gif?

florianasse Messages postés 6 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 10 juin 2009 - 10 juin 2009 à 13:47
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012 - 12 juin 2009 à 11:51
Bonjour,
Je suis débutant en JAVA et j'aimerais faire défiler une image gif le long d'une droite mais je ne sais pas quoi utiliser (paint, repaint, sleep...).
Est-ce que quelqu'un peut me donner un petit coup de pouce sa serait sympa :D
Merci d'avance !!

Voici mon code :

import java.awt.*;
import javax.swing.*;
import java.net.* ;

public class TestDessin extends JPanel {

    private Color color;
    private float offsetX;
    private float offsetY1;
    private float offsetY;
    private float offsetX1;
    private float fa;
    private float fb;
    private float fx;
    private float fy;
   
    public TestDessin() {
    }
    public TestDessin(Color color, float offsetX, float offsetY, float offsetX1, float offsetY1) {
        super();
        this.color = color;
        this.offsetX = offsetX;
        this.offsetX1 = offsetX1;
        this.offsetY = offsetY;
        this.offsetY1 = offsetY1;
        setPreferredSize(new Dimension(1000, 600));
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(color);
        Image image = this.getToolkit().getImage("plan.gif");
        g.drawImage(image,0,0,this);
        Image image1=this.getToolkit().getImage("b1.gif");
        g.drawImage(image1,(int)offsetX,(int)offsetY,this);
        Image image2=this.getToolkit().getImage("b1.gif");
        g.drawImage(image2,(int)offsetX1,(int)offsetY1,this);
        g.drawLine((int)offsetX, (int)offsetY, (int)offsetX1, (int)offsetY1);
    }
    public void repaint(Graphics g) throws InterruptedException
    {
        float x;
        this.fa=(this.offsetY1-this.offsetY)/(this.offsetX1-this.offsetX);
        this.fb=this.offsetY-this.fa*this.offsetX;
        for(x=offsetX; x<=offsetX1; x++)
        {
            this.fx=x;
            this.fy=this.fa*this.fx+this.fb;
            Image image3=this.getToolkit().getImage("avionS1.gif");
            g.drawImage(image3,(int)offsetX,(int)offsetY,this);
            JOptionPane.showMessageDialog(null, "y:"+this.fy+"\nx:"+this.fx);
        }
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(500,400);
        // adapter aux coordonné XY de la villeD et XY de la ville A
        TestDessin t=new TestDessin(Color.RED, 50,30,300,100);
        jf.getContentPane().add(t);
        jf.setVisible(true);
       
       
    }

}

3 réponses

florianasse Messages postés 6 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 10 juin 2009
10 juin 2009 à 17:21
Je pense m'être rapprocher de la solution, je ne trouve juste pas le moyen de rappeler la méthode paint dans le run... Si quelqu'un à la solution

import java.awt.*;
import javax.swing.*;
import java.net.* ;

public class TestDessin extends JPanel implements Runnable  {

    private Color color;
    private float offsetX;
    private float offsetY1;
    private float offsetY;
    private float offsetX1;
    private float fa;
    private float fb;
    private float fx;
    private float fy;
    public Thread T;
    
    
    public TestDessin(Color color, float offsetX, float offsetY, float offsetX1, float offsetY1) {
        super();
        this.color = color;
        this.offsetX = offsetX;
        this.offsetX1 = offsetX1;
        this.offsetY = offsetY;
        this.offsetY1 = offsetY1;
        this.fx=offsetX;
        setPreferredSize(new Dimension(1000, 600));
        T = new Thread(this);
        T.start();
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(color);
        Image image = this.getToolkit().getImage("plan.gif");
        g.drawImage(image,0,0,this);
        Image image1=this.getToolkit().getImage("b1.gif");
        g.drawImage(image1,(int)offsetX,(int)offsetY,this);
        Image image2=this.getToolkit().getImage("b1.gif");
        g.drawImage(image2,(int)offsetX1,(int)offsetY1,this);
        g.drawLine((int)offsetX, (int)offsetY, (int)offsetX1, (int)offsetY1);
        g.drawLine((int)offsetX-1, (int)offsetY, (int)offsetX1-1, (int)offsetY1);
        g.drawLine((int)offsetX+1, (int)offsetY, (int)offsetX1+1, (int)offsetY1);
        g.drawLine((int)offsetX-2, (int)offsetY, (int)offsetX1-2, (int)offsetY1);
        g.drawLine((int)offsetX+2, (int)offsetY, (int)offsetX1+2, (int)offsetY1);
        g.drawLine((int)offsetX-3, (int)offsetY, (int)offsetX1-3, (int)offsetY1);
        g.drawLine((int)offsetX+3, (int)offsetY, (int)offsetX1+3, (int)offsetY1);
        Image image3=this.getToolkit().getImage("avionS1.gif");
        g.drawImage(image3,(int)fx,(int)fy,this);
    }

    public void run() {
        while (true) {
            if(fx<offsetX1)
            {
                this.fa=(this.offsetY1-this.offsetY)/(this.offsetX1-this.offsetX);
                this.fb=this.offsetY-this.fa*this.offsetX;
                fx=fx+1;
                fy=fa*fx+fb;
                invalidate();
                try {T.sleep(100);} catch (InterruptedException e) {}
            }
        }
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(500,400);
        // adapter aux coordonné XY de la villeD et XY de la ville A
        TestDessin t=new TestDessin(Color.RED, 50,30,300,100);
        jf.getContentPane().add(t);
        jf.setVisible(true);
        JTextField villA = new JTextField("Paris");
        JTextField villD = new JTextField("New York");
        jf.getContentPane().add(villA);
        jf.getContentPane().add(villD);
        villA.setEditable(false);
        villD.setEditable(false);
        villA.setBounds(230,300,100,20);
        villD.setBounds(100,300,100,20);

    }

}
0
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
12 juin 2009 à 11:48
Salut

Je n'ai pas trop analysé ta source, mais j'ai vu que n'as utilisé aucune des techniques suivantes :

*) As tu pensé à regarder du côté de l'utilisation de Threads ?
Je ne peux pas trop t'en parler vu que je ne m'en suis pas trop servi, mais les threads peuvent te permettre de réaliser une tâche de manière périodique.

*) As-tu pensé à regarder du côté de java.util.TimerTask ?

*) Object#wait(long timeOutMilleseconds) ?

Cette dernière est de loin la plus facile à utiliser, mais elle semble aussi la moins pratique

Voilà, la javadoc devrais t'en dire à coup sûr plus que moi .

Salut,
loloof64
0
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
12 juin 2009 à 11:51
Mille excuses, tu dérive l'interface Runnable et tu utilises sleep(long) ...
Désolé pour ma réponse un peu hative.
Dans ce cas là, je ne sais pas trop
0
Rejoignez-nous