Pause entre deux affichages de JLabel

Fermé
Buche - 11 mars 2012 à 01:23
 carottebleue - 20 avril 2013 à 16:34
Bonjour a tous,

Je viens vers vous pour un petit problème de Java dans lequel je débute.
Je souhaite que mon programme affiche des cartes a jouer (chacune étant sous forme de JLabel en l'occurence) en marquant une pause entre chaque affichage sur mon JPanel.
L'affichage sans temps d'attente entre les cartes fonctionne bien, mais des que j'introduis une pause .... ca ne marche que sur la console...
En effet, après mes recherches sur le net, j'ai essayé un thread.sleep(), et meme des fonctions systèmes:
Cela fonctionne sur la console(on voit bien la pause entre les différentes cartes) cependant les cartes ne s'affichent pas une a une a l'écran, mais toutes groupées a la fin.

Voila, si vous avez déja rencontré ce genre de probleme ca m'interesse bcp :)

Merci a tous,
Buche


3 réponses

Re tout le monde!

Meme pas une petite idée? un petit conseil siouplé ? :)
Je suis complètement bloqué perso.

Merci de votre aide!
0
carottebleue
19 avril 2013 à 16:48
J'ai le même problème, si quelqu'un trouve la solution, merci d'avance.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
19 avril 2013 à 19:00
C'est parce qu'il ne faut pas faire la pause à l'intérieur du paint (ou repaint), mais dans une méthode extérieure qui fera plusieurs appels (aussi rapides que possible) à paint avec des pauses entre deux affichages.

Mais ce serait plus simple d'avoir ton code pour te montrer la différence.
0
carottebleue
20 avril 2013 à 12:43
J'ai pas tout compris mais voilà mon code :

testLocation(p, ZONE_IMAGE_10, "mouseClicked - data 10");//case 1
if (testLocation( p, ZONE_IMAGE_10, "mouseClicked - data 10")){
int x =10;
int y =10;
while (true){
ImageIcon ii = new ImageIcon(this.getClass().getResource("Essaye-lapin2.gif"));
imageLabel.setIcon(ii);
imageLabel.setBounds(x,y,ii.getIconWidth(),ii.getIconHeight());
imageLabel.setVisible(true);
repaint();

try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
/// le but c'est de mettre une pause ici
x=x+100;
y=y+1;
imageLabel.setIcon(ii);
imageLabel.setBounds(x,y,ii.getIconWidth(),ii.getIconHeight());
imageLabel.setVisible(true);
//ImageIcon ii1 = new ImageIcon(this.getClass().getResource("Essaye-lapin2.gif"));
}
//imageLabel1.setIcon(ii1);
// imageLabel1.setBounds(x,y,ii.getIconWidth(),ii.getIconHeight());
//imageLabel1.setVisible(true);

}
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 avril 2013 à 15:14
Vu que je n'ai pas ton code complet je n'ai pas trouvé l'erreur, mais en gros ta méthode est bonne. Tu as en particulier utilisé une méthode extérieure pour faire appel à repaint (ce que n'avait pas du faire Buche vu la description de son problème)

Attention, si tu fais new ImageIcon à chaque tour de boucle, tu vas lire et relire plusieurs fois la même image ce qui va perdre du temps et consommer inutilement de la mémoire. Il vaut mieux charger l'image une fois au départ puis la réutiliser.

J'ai repris l'idée de ton code pour te montrer un exemple complet :

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Fenetre extends JFrame
{
    private static final long serialVersionUID = 1;

    protected final JLabel label;
    
    protected int x=0, y=0;
    
    public Fenetre()
    {
        ImageIcon img = new ImageIcon(Fenetre.class.getResource("Essaye-lapin2.gif"));
        
        label = new JLabel(img);
        label.setSize(img.getIconWidth(),img.getIconHeight());
        label.setLocation(x,y);
        
        setLayout(null);
        add(label);
        
        setSize(500,500);
        setExtendedState(MAXIMIZED_BOTH);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    /*
    @Override
    public void paint(java.awt.Graphics g)
    {
        super.paint(g);
        System.out.printf("paint x=%d,y=%d\n",x,y);
    }
    */
    
    public void deplacerImage()
    {
        while (true)
        { 
            x += 10;
            y += 10;
            
            label.setLocation(x,y);
            repaint();
            
            try 
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                break;
            }
        }
    }
    
    public static void main(String[] args)
    {
        final Fenetre f = new Fenetre();
        
        f.deplacerImage();
    }    
}
0
carottebleue
20 avril 2013 à 16:34
Ok, merci ! entre temps j'ai eu de l'aide pour une autre solution mais merci du coup de main, par ce que ça peut toujours servir.
0