Rafraichissement JPanel d'une JFrame [Résolu]

kishkaya 366 Messages postés samedi 26 juin 2004Date d'inscription 17 avril 2008 Dernière intervention - 11 mars 2008 à 21:04 - Dernière réponse : kishkaya 366 Messages postés samedi 26 juin 2004Date d'inscription 17 avril 2008 Dernière intervention
- 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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
uhrand 493 Messages postés samedi 20 mai 2006Date d'inscription 15 juillet 2012 Dernière intervention - 12 mars 2008 à 18:43
3
Merci
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);
        }
    }

Merci uhrand 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de uhrand
kishkaya 366 Messages postés samedi 26 juin 2004Date d'inscription 17 avril 2008 Dernière intervention - 12 mars 2008 à 19:18
0
Merci
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
Commenter la réponse de kishkaya

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.