Modifier le panel d'une fenetre

Résolu
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010 - 19 mars 2010 à 17:35
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010 - 19 mars 2010 à 18:28
Bonjour à tous, alors voila je suis débutant en java et j'aimerais savoir comment lancer une animation dans une fenêtre après avoir cliqué sur un bouton. Voila comment je m'y prend :

// ****************** Classe Appli ******************************
public class Appli extends JFrame implements ActionListener{
    private JPanel cadre = new JPanel();
    private CadreMenu menu = new CadreMenu();
    private CadreJeu jeu = new CadreJeu();
    
    public Appli(){
        this.setTitle("Jeu");
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        
        cadre.setLayout(new BorderLayout());
        cadre.add(menu, BorderLayout.CENTER);
        this.menu.getBtJouer().addActionListener(this);
        
        this.setContentPane(cadre);
        this.setVisible(true);
    }
    
    
    public void actionPerformed(ActionEvent arg0) {        
        this.cadre.remove(menu);
        this.cadre.add(jeu,BorderLayout.CENTER);
        this.setContentPane(cadre);
        this.repaint();
        while(true){
            jeu.setX(jeu.getX() + 1);
            jeu.setY(jeu.getY() + 1);
            this.repaint();
        } 
    }

    public static void main(String[] args) {
        new Appli();
    }
}


// ********************** Classe CadreJeu ********************************
public class CadreJeu extends JPanel{
    private int x,y;
    
    public CadreJeu(){
        this.x = this.getX();
        this.y = this.getY();
    }
    
    @Override
    public void paint(Graphics g){                
                g.setColor(Color.white);
                g.fillRect(0, 0, this.getWidth(), this.getHeight());
                g.setColor(Color.red);
                g.fillOval(x, y, 50, 50);                      
        }

    public int getX(){
        return this.x;
    }
    public int getY(){
        return this.y;
    }
    public void setX(int x){
        this.x = x;
    }
    public void setY(int y){
        this.y = y;
    }
}


//******************************* Classe CadreMenu ************************************
public class CadreMenu extends JPanel{
    private JButton btJouer = new JButton("JOUER");
    
    public CadreMenu(){
        btJouer.setBounds(100, 100, 200, 75);
        this.add(btJouer);
    }
    public JButton getBtJouer(){
        return btJouer;
    }
}


J'ai bien compris que l'appli bloque dans la boucle while mais je ne comprend pas pourquoi ?
Si quelqu'un pouvait m'expliquer ou me donner une meilleur méthode je lui en serais très reconnaissant.

8 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
19 mars 2010 à 18:25
Salut,

Ok, c'est normal : la méthode sleep peut lancer l'exception InterruptedException il te faut entourer l'appel par un bloc try catch :
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
19 mars 2010 à 17:45
Salut,

C'est tout simple : tu accapares toutes les ressources du CPU, et il n'a pas le temps de rendre la main au thread de SWING pour retracer la fenêtre !

Il te faut faire un thread pour faire ce que tu cherches à faire, et faire des pauses dans ton thread histoire de ne pas écrouler les performances de ton pc (10 ms par exemple).
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010
19 mars 2010 à 18:00
Merci pour la réponse si rapide. J'ai donc créé une classe qui hérite de Thread mais comment puis je passer ma fenêtre à la méthode run ...

public void actionPerformed(ActionEvent arg0) {        
        this.cadre.remove(menu);
        this.cadre.add(jeu,BorderLayout.CENTER);
        this.setContentPane(cadre);
        this.repaint();
        new Animation(this);  
}

private class Animation extends Thread{
        private Appli appli;
        public Animation(Appli appli){
            this.appli = appli;
        }
        @Override
        public void run(){
            while(true){
                appli.jeu.setX(jeu.getX() + 1);
                appli.jeu.setY(jeu.getY() + 1);
                appli.repaint();
            }     
        }
    }
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
19 mars 2010 à 18:08
Salut,

C'est pas tout à fait correct : il faut lui passer l'instance de ton JFrame et non l'instance de ton ActionListener : le this dans ton actionPerformed désigne l'instance du ActionListener, à moins que ton actionListener soit ta JFrame en question.

Il faut également lancer le thread (et penser à la temporisation comme je te le disais un peu plus haut) :
public void actionPerformed(ActionEvent arg0) {        
        this.cadre.remove(menu);
        this.cadre.add(jeu,BorderLayout.CENTER);
        this.setContentPane(cadre);
        this.repaint();
        Animation animation = new Animation(this); // Mettre l'instance du JFrame si this référence l'instance d'un ActionListener
        animation..start(); // démarrage du thread
}

private class Animation extends Thread{
        private Appli appli;
        public Animation(Appli appli){
            this.appli = appli;
        }
        @Override
        public void run(){
            while(true){
                appli.jeu.setX(jeu.getX() + 1);
                appli.jeu.setY(jeu.getY() + 1);
                appli.repaint();
                Thread.sleep(10); // temporisation de 10 ms
            }     
        }
    }

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010
19 mars 2010 à 18:15
Merci, j'ai bien compris le principe mais la temporisation me renvoie une erreur, j'ai bien essayé Thread.sleep(10); et this.sleep(10); mais ca ne marche pas
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
19 mars 2010 à 18:18
Salut,

C'est quoi l'erreur ?

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010
19 mars 2010 à 18:21
Appli.java:48: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
Thread.sleep(20);
0
cs_Romain62 Messages postés 7 Date d'inscription dimanche 13 avril 2008 Statut Membre Dernière intervention 21 mars 2010
19 mars 2010 à 18:28
Génial ca marche! Merci beaucoup pour ton aide si rapide, bonne soirée
0