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

Agents de placement/Fenêtres Java Discussion :

Fermer un JPanel sans pour autant fermer tout le programme


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Fermer un JPanel sans pour autant fermer tout le programme
    Bonjour,

    J'ai un souci concernant la fermeture d'une fenêtre. Mon code est composé d'un JPanel que je mets dans mon Main (qui est un JFrame). À partir de mon JPanel, j'ai un bouton qui me permet d'ouvrir une autre fenêtre du même type. Je souhaite pouvoir fermer chaque JPanel indépendamment grâce à un JButton. J'ai cherché pas mal de solutions, mais le mieux que j'aie réussi à faire aura été un "System.exit(0)" qui ferme tout le programme d'un coup.

    Est-ce qu'il existe une solution pour fermer seulement une fenêtre à la fois avec un JButton ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 788
    Points : 27 794
    Points
    27 794
    Billets dans le blog
    2
    Par défaut
    Salut,

    Fermer un JPanel n'a pas vraiment de sens. C'est la JFrame qu'il faut fermer. Pour fermer une JFrame par le code, il suffit d'appeler sa méthode dispose().
    Attention, parce qu'il existe déjà naturellement un bouton sur une fenêtre qui permet de déclencher une action de fermeture dont on peut configurer le comportement, tel que ça ferme seulement la fenêtre, ça ferme arrête l'application, ou ça ne fasse rien de spécial d'autre que de soulever un évenement. Mais tu n'as pas ce bouton à priori, puisque, on le voit dans dans ton autre discussion, ta JFrame est undecorated.

    Ensuite, comme tu veux pouvoir fermer la fenêtre par action sur un bouton, situé dans un JPanel, il te faut connaître la référence de la JFrame dans l'action listener du bouton. On pourrait passer la référence de la fenêtre au contructeur du panel, qui la transmétra à l'action listener au moment de l'enregistrement. On peut également utiliser la méthode utilitaire SwingUtilities.getWindowAncestor(component).

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MyPanel extends JPanel {
     
        public MyPanel() {
            JButton button = new JButton("Close");
            /**...**/ // ajout du bouton à l'endroit voulu dans le panel
           button.addActionListener(e-> close());
     
       }
     
       public void close() {
    	   SwingUtilities.getWindowAncestor(this).dispose();
       }
     
    }
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Ça fonctionne, merci encore !
    Petite précision au cas où quelqu'un ayant le même souci tomberait sur ce forum, pour que cela marche j'ai dû faire "JPanel me = this;" en dehors de ma méthode avant de pouvoir faire un "SwingUtilities.getWindowAncestor(me).dispose();", sinon on m'affichait une erreur.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    11 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 : 11 788
    Points : 27 794
    Points
    27 794
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par CodeWoman Voir le message
    Petite précision au cas où quelqu'un ayant le même souci tomberait sur ce forum, pour que cela marche j'ai dû faire "JPanel me = this;" en dehors de ma méthode avant de pouvoir faire un "SwingUtilities.getWindowAncestor(me).dispose();",
    Hein ? Quelle erreur ? Où ça ?
    SwingUtilities.getWindowAncestor(this).dispose(); fonctionne très bien tant que c'est dans une méthode de l'instance de JPanel. En revanche, si tu parles de faire ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
           button.addActionListener(new ActionListner() {
     
                   public void actionPerformed(ActionEvent e) {
     	                SwingUtilities.getWindowAncestor(this).dispose();
                   }
     
               });
     
    }
    Alors, oui, ça ne peut pas compiler parce que this c'est l'instance d'ActionListener.

    Il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           button.addActionListener(new ActionListner() {
    
                   public void actionPerformed(ActionEvent e) {
     	                SwingUtilities.getWindowAncestor(MyPanel.this).dispose();
                   }
    
               });
     
    }
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    merci beaucoup pour ce post.

  6. #6
    Membre habitué
    Profil pro
    developpeur
    Inscrit en
    septembre 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : septembre 2010
    Messages : 192
    Points : 149
    Points
    149
    Par défaut myPanel.dispose()
    Si j'utilise un JPanel pour infos sans input utilisateur entre deux classes, le temps que la seconde se load et une fois la seconde loader, je ferme le JPanel avec dispose().
    Ma question est: puis-je réutiliser le JPanel pour par exemple un autre traitement assez long, le JPanel est comme un progress Bar mais seulement un JLabel qui décrit l'étape en cours.

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

Discussions similaires

  1. [XL-2007] Recupération valeur ds d'autres classeurs sans pour autant l'ouvrir
    Par NulenExcel77 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 11/04/2012, 15h28
  2. Réponses: 26
    Dernier message: 15/10/2010, 13h18
  3. Réponses: 3
    Dernier message: 29/05/2007, 09h16
  4. Fermer le pc sans message ...
    Par Coussati dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 26/12/2005, 19h28
  5. Fermer la fentre sans quitter le programme?
    Par tomburn dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/12/2004, 17h02

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