IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Rafraichir ma fenetre


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 33
    Points : 31
    Points
    31
    Par défaut Rafraichir ma fenetre
    Bonjour Tout le monde,
    j'ai fais plein de recherches sur le net sur le rafraichissement des JPanel mais j'arrive pas a avoir la solution a mon probleme.
    Bon je m'explique:
    j'ai un JLabel qui affiche une question a l'utilisateur et un Jpanel qui contient JButton[4](reponse dont une est vraie ) . Lorsqu'il clique sur la bonne reponse une autre question s'affiche mais la fenetre ne se met pas a jour;
    Voici un peu a quoi ressemble mon code:

    J'ai une classe Fenetre qui herite JFrame();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class Panneau extends JPanel implements ActionListener
    {
           public Panneau()
           {
                 //une requete permettant choisir aleatoirement une question dans bdd
                 String[] tab = {"question", "reponse", ...}; //je stocke cela dans un tableau
                 JButton[] bout = new JButton[tab.length];
                 for(int i = 0; i < bout.length; i++)
                 {
                     bout[i] = new JButton(tab[i]);
                     bout[i].addActionListenner(this);
                 }
           }
     
           public void actionPerformed(ActionEvent event)
           {
                 for(int i = 0; i < bout.length; i++)
                 {
                     if(bout[i].getText() == reponse)
                     {
                           Panneau pan = new Panneau();
                           // le probleme j'arrive pas a acceder au ci dessous pour la rafraichir
                           //Fenetre.getContentPane().removeAll();
                           //Fenetre.getContentPane().add(pan);
                     }
                 }
           }
     
    }

    Merci d'avance pour vos reponses

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Pour simplifier, une JFrame affiche dans son contentPane un composant composé lui même de composants : dans ton cas, il s'agit de ta classe Panneau.

    Il n'y a 2 moyens de modifier cet affichage :

    • Soit tu remplaces le panneau actuellement mis dans la JFrame, par une nouvelle version ;
    • Soit tu modifies le panneau pour qu'il affiche la nouvelle question ;


    Il en existe éventuellement une troisième (à base de CardLayout), mais elle peut être limitée, et pas forcément plus simple, si tu as un nombre de questions non fini et/ou non déterminé. Je n'en parlerai pas donc.

    Le premier cas peut sembler le plus facile, et, il l'est probablement dans le fait que tu crées une nouvelle instance de Panneau à chaque fois, donc, en quelque sorte, depuis zéro, donc il n'y a pas à se préoccuper de ce qui pouvait y avoir avant. Mais ceci oblige d'avoir une référence sur la fenêtre, pour remplacer un panneau par un autre. Et, c'est bien le problème que tu as rencontré : comment avoir cette référence ?

    Il y a 3 façons d'aborder la chose :

    • Soit tu utilises la méthode getTopLevelAncestor() de ton Panneau actuel, pour connaitre la JFrame qui le contient (attention, la méthode retourne du Container, qu'il faut caster en JFrame). Ensuite, il suffit d'enlever l'ancien Panneau, et de mettre le nouveau (à moins que tu aies directement mis ton Panneau en tant que contentPane : comme il ne peut y en avoir qu'un, le nouveau remplace forcément l'ancien) ;
    • Soit tu passes la référence de la JFrame au Panneau, en argument de son constructeur, ce qui permet de la connaitre et donc de la manipuler directement. Mais ceci peut être lourd, et ajoute une contrainte dans l'utilisation de ton Panneau
    • La troisième est la plus élégante, mais elle demande un peu plus de code : il suffit que le code de traitement soit dans la frame. Il faut que la frame puisse savoir qu'on a répondu à une question donc cocher une case dans le Panneau, ce qui peut se faire pas évènement. On peut soit faire ses propres évenements, soit faire que c'est la JFrame qui s'enregistre comme écouteur au lieu du Panneau comme c'est fait actuellement. Dans ce cas, la JFrame peut complètement gérer les différents Panneau qui s'énchainent.


    Pour la seconde solution, celle de regénérer le contenu du Panneau, il y a plusieurs façons de faire, en fonction des composants :

    • Pour un JLabel, on peut modifier facilement le texte affiché (idem pour un JTextPane, ou autre JTextComponennt) : donc modifier les libellés de la question est facile
    • Pour les checkbox,
      • Soit tu mémorises les checkbox créées dans une variable (ArrayList par exemple), ce qui permet de les supprimer (les enlever de Panneau en fait) facilement
      • Soit tu utilises un second JPanel où il n'y a que les checkbox, : pour supprimer les checkbox, il suffit de supprimer ce panel
      • Soit éventuellement tu utilises une JTable, pour afficher une liste de checkbox, mais si tu n'as jamais utilisé de JTable, ça peut être un peu long à apprendre le minimum pour que tu puisses réaliser ce que tu veux faire

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 33
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup pour ta brillante explication
    Dans mon cas je préfère opter pour la première façon de la première solution notamment l'utilisation de la fonction getTopLevelAncestor() puisque j'ai plus de 150 questions dans ma BD (l'option pour les cardLayout n'est pas efficace) et j'ai plein de composants de mon Panneau.
    A ce propos j'ai jamais utilisé cette fonction donc tu peux me donner un petit exemple pratique de son utilisation Si j'en fais pas trop bien sure

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Moi, je ferais plutôt la troisième, qui est plus simple. Mais si tu veux utiliser getTopLevelAncestor(), c'est tout simple.

    Dans ton code, tu as commencé à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Fenetre.getContentPane().removeAll();
    //Fenetre.getContentPane().add(pan);
    Pour obtenir la référence de la fenêtre qui contient l'instance de Panneau, il suffit de faire juste avant ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JFrame fenetreParente = (JFrame)Panneau.this.getTopLevelAncestor();
    Je te laisse déduire le reste des modifications à apporter à ton code...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 33
    Points : 31
    Points
    31
    Par défaut
    Merci Merci merci merci merci merci beaucoup ça marche j'ai fallit avoir des cheveux blancs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GTKmm] rafraichir de fenetre a partir d'un thread
    Par bugmenot dans le forum GTK+
    Réponses: 3
    Dernier message: 14/05/2007, 22h28
  2. Rafraichir une fenetre parent par la fermeture d'un popup
    Par loleske dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 19/05/2006, 08h14
  3. Redessiner (rafraichir) une fenetre
    Par @drien dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 17/01/2006, 21h59
  4. Rafraichir une fenetre ??
    Par MonsieurAk dans le forum Windows
    Réponses: 8
    Dernier message: 09/08/2005, 15h04
  5. [API] Rafraichir une fenetre ?
    Par laurent_h dans le forum Windows
    Réponses: 2
    Dernier message: 17/04/2004, 23h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo