Modifier le panel d'une fenetre

[Résolu]
Signaler
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010
-
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010
-
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

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
129
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
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
129
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
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010

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();
            }     
        }
    }
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
129
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
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010

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
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
129
Salut,

C'est quoi l'erreur ?

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010

Appli.java:48: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
Thread.sleep(20);
Messages postés
7
Date d'inscription
dimanche 13 avril 2008
Statut
Membre
Dernière intervention
21 mars 2010

Génial ca marche! Merci beaucoup pour ton aide si rapide, bonne soirée