Rafraichissement JPanel d'une JFrame

Résolu
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008 - 11 mars 2008 à 21:04
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008 - 12 mars 2008 à 19:18
Bonjour,
J'essaie infructueusement de faire une classe héritée de JFrame et contenant une méthode permettant de changer le contenu de la JFrame. public void changerJPanel(JPanel pan);
Je rafraichis la JFrame qui ne contient qu'un JPanel avec ces méthodes :
getContentPane().removeAll();
        getContentPane().add(pan);
        getContentPane().validate();
Malheureusement, cela ne fonctionne pas parfaitement. Parfois, j'appelle un listener (au clic d'un bouton contenu dans le JPanel courant) qui appele cette méthode changerJPanel.

Le problème, qui se pose alors, est que la JFrame ne s'actualise pas vraiment, il faut promener la souris sur la JFrame pour que la rafraichissement se fasse petit à petit.

Connaitriez vous une astuce me permettant de modifier ma méthode changerJPanel pour corriger ce problème ? Pourriez vous m'expliquer le point faux de ma démarche ?

Merci pour votre aide

_Marikou

2 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 mars 2008 à 18:43
C'est beaucoup mieux avec CardLayout:

        mainpanel = new JPanel(new CardLayout());
        panel1 = JPanel();
        panel2 = JPanel();
        panel3 = JPanel();
        mainpanel.add(panel1, "panel1");
        mainpanel.add(panel2, "panel2");
        mainpanel.add(panel3, "panel3");

        getContentPane().add(mainpanel, BorderLayout.CENTER);

...
        changerJPanel(mainpanel, true);//afficher le panel suivant
...
        changerJPanel(mainpanel, false);//afficher le panel précédent
...
    public void changerJPanel(JPanel pan, boolean next){
        if(next){
            ((CardLayout) pan.getLayout()).next(pan);
        }else{
            ((CardLayout) pan.getLayout()).previous(pan);
        }
    }
3
kishkaya Messages postés 365 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 17 avril 2008
12 mars 2008 à 19:18
Merci pour le tuyau mais le problème est plus profond.

En fait il faut dire explicitement que le JPanel est invalidate() et forcer le repainting repaint(). Je sais pas trop a quoi c'est du mais comme je fais plusieurs requetes en même temps sur plusieurs BDD différentes, qu'il y a plusieurs Thread en fond qui tournent avec du JNI, le repaint du JPanel n'est pas appelé explicitement. Quand je fais un petit demonstrateur de changer de JPanel ca marche nickel

Merci pour le conseille du CardLayout. Mais le voyage de JPanel en JPanel est non prévu, en fait il n'y a pas d'ordre. J'accede à un lecteur RFID Pcmia (grâce à une DLL) je récupère des infos dans le Tag RFID et j'interroge deux BDD (Mysql et DB2) en fonction des résultats on va vers tel ou vers tel autre JPanel.

Cependant ton exemple est adaptable à ce cas avec un int ou lieu d'un boolean.

Merci pour l'aide.

PS: pour ceux qui auraient des problèmes de repainting de JFrame, il arrive que le JPanel soit bien repaint mais que la JFrame ne le soit pas, on peut de la même manière forcer le refraichissement.

_Marikou
0
Rejoignez-nous