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
    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

    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
    Ç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

    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([highlight]MyPanel.this[/highlight]).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
    merci beaucoup pour ce post.

  6. #6
    Membre habitué
    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.