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 :

Comment fermer ma fenêtre secondaire ?


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut Comment fermer ma fenêtre secondaire ?
    Bonjour, j'ai une fenêtre principale avec un menu. A travers mon menu j'accède à une autre fenêtre. Dans cette nouvelle fenêtre, j'ai 3 JPanel dont un qui contient un bouton Ok. J'aimerais fermer cette fenêtre en cliquant sur ce bouton sans fermer la fenêtre principale.
    Le problème, c'est que je n'ai pas accès dans le ActionPerformed à ma fenêtre secondaire (celle que je veux fermer) donc je ne peux pas utiliser la fonction maJFrame.dispose();
    Voici mon code, cela sera plus explicite.
    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
     
    public class PanelBoutonOk extends JPanel implements ActionListener
    {
        JButton ok = new JButton("Ok");
        public PanelBoutonOk()  //Constructeur
        {
            ok.addActionListener(this);
            add(ok);
        }
        public void actionPerformed(ActionEvent e) 
        {
            Object s = (JButton)e.getSource();
            if((JButton)s == ok)
            {
                //F.dispose(); // Il ne trouve pas la JFrame secondaire.
                System.out.println("Bouton ok clické");
            }    
        }
    }
    Merci d'avance pour votre aide.
    bonne soirée

  2. #2
    Membre averti
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Par défaut
    Salut.

    Essaye this.close() peut-être..

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 22
    Par défaut
    this.dispose() pardon !!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Non, ca ne marche pas. Le this se réfère à un JPanel dans mon exemplaire, c'est pour cela que ca foire mais je te remercie quand même pour ta réponse.

  5. #5
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Bonsoir,

    En partant de this qui est ton panel tu peux pas en faisant des getParent() remonter jusqu'a ta Jframe pour la fermer... c'est peut etre pas la meilleur solution mais ca devrai marcher.

    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (!this.getParent() instanceof JFrame){
    Component = this.getParent();
    }
    ((JFrame)Component).dispose();

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    C'est possible que cela marche, effectivement.
    Cependant, j'ai un petit problème, il ne veut pas reconnaître le "!" car il me dit : "The operator ! is undefined for the type(s) Container".
    Et si je met cette ligne de code :
    while(!(this.getParent() instanceof JFrame)){ ... }
    ca ne marche pas non plus.
    Comment faire ?
    Merci...

  7. #7
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    T'a essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this.getParent() instanceof JFrame == false)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Oui, j'ai essayé et ça fait planter tout le programme.

  9. #9
    Membre expérimenté Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Par défaut
    Tu peux créer dans ton JPanel une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    addMyListener(ActionListener al)
    {
         ok.addActionListener(al);
    }
    Puis dans ta JFrame secondaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PanelBoutonOk pbok = new PanelBoutonOk();
    pbok.addMyListener(this);
    Ce n'est donc plus je JPanel qui est listener mais la JFrame

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Je vois l'astuce mais j'ai encore une erreur, je cherche comment la résoudre mais je trouve pas.

    Dans ma classe PanelBoutonOk, j'ai donc rajouter une méthode que voici :
    public void addMyListener(ActionListener AL)
    {
    ok.addActionListener(AL);
    }

    Puis j'ai rajouté dans ma classe JFrame secondaire ces trois lignes :
    JPanel panelBouton = new JPanel();
    panelBouton = new PanelBoutonOk();
    panelBouton.addMyListener(this); // ou panelBouton.addMyListener(F)

    Mais pour cette dernière ligne, il me sort le message d'erreur suivant :
    The method addMyListener(JFrame) is undefined for the type JPanel

    et je suis bloqué...
    Dsl mais je débute en java donc j'ai quelques petits problèmes mais jesper bientot ne plus les avoir en swing en tout cas
    Merci

  11. #11
    Membre expérimenté Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Par défaut
    C'est normal car pour le programme ton panelBouton est un simple JPanel et pas un PanelBoutonOk. Donc c'est normal qu'il ne trouve pas ta méthode dans la classe JPanel du JDK .

    Il faut bien comprendre 2 choses:
    PanelBoutonOK est un JPanel
    JPanel n'est pas forcément PanelBoutonOK

    Donc il y a deux solutions possibles pour résoudre ton problème:

    Soit tu garde la déclaration je ton panelBouton (en tant que JPanel) et tu spécifie plus tard dans le programme que panelBouton est en plus un PanelBoutonOk en le castant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((PanelBoutonOk)panelBouton).addMyListener(this)
    Ou alors plus simple tu définit au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PanelBoutonOk panelBouton = new PanelBoutonOk();
    Comme ça, panelBouton est considéré comme un PanelBoutonOk mais aussi comme un JPanel. Tu aura donc accès au méthodes de PanelBoutonOk ET de JPanel a partir de ton objet panelBouton

    N'oublie pas non plus d'ajouter que ta JFrame doit implémenter ActionListener et en conséquent la méthode ActionPerformed(ActionEvent evt)

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Voilà, j'ai rien changé sauf ceci à la place des 3 autres lignes dans la classe de ma fenêtre secondaire :

    PanelBoutonOk panelBouton = new PanelBoutonOk();
    panelBouton.addMyListener(F);

    Il me sort toujours le même message, ya un truc que je ne dois pas comprendre
    "The method addMyListener(ActionListener) in the menu.PanelBoutonOk is not applicable for the arguments (JFrame)"

    Désolé, je me sens un peu mauvais dans la discipline là.

  13. #13
    Membre expérimenté Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Par défaut
    N'oublie pas non plus d'ajouter que ta JFrame doit implémenter ActionListener et en conséquent la méthode ActionPerformed(ActionEvent evt)

    a tu fais dans ta Fenetre

    public class MaFrame extends JFrame implements ActionListener
    {
    ...
    ...
    public void ActionPerformed(ActionEvent evt)
    {
    //traitement
    }


    }

    ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Ok, je vois. Je viens de réaliser que j'ai fais une énorme erreur de programmation au début de la création de mon projet.
    Ton truc doit marcher normalement.

    Mon erreur est que j'ai créé une classe Menu avec un constructeur vide.
    Et en fait, ce sont les méthodes de cette classe menu qui créent toutes mes fenêtres et non le constructeur de la classe menu.

    Est ce bien une erreur ou je divague ? Parceque tu me dis d'implémenter par ActionListener ma classe maFrame mais je n'ai pas une classe mais une fonction qui créee la fenêtre.

    Bon ba, si j'ai fais cette grosse erreur, je vais recommencer. Confirmez moi mon erreur si s'en est une. Merci.
    A+

  15. #15
    Membre expérimenté Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Par défaut
    Je suppose que tu crées ta frame comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JFrame maFrame = new JFrame()
    maFrame.add(...
    ...
    ...
    ...
    Tu a deux solutions

    Soit tu veux que ta fenêtre soit Listener du bouton et se ferme quand le bouton est appuyé.

    Ou alors tu passe simplement la fenetre en argument quand tu crée ton panelBouton.

    Dans le premier cas tu dois créer une class MaFrame
    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 MaFrame extends javax.swing.JFrame implements ActionListener
    {
     
        /** Creates new form MaFrame */
        public MaFrame()
        {
            initComponents();
        }
     
        public void actionPerformed(ActionEvent e)
        {
            this.dispose();
        }
    }
    donc vu que la JFrame implémente ActionListener elle peut être ajoutée comme Listener du bouton.


    Sinon y'a une solution un peu moins clean. Dans le constructeur de ton panelboutonok tu ajouter la JFrame, et tu ferme ce jframe quand tu clique sur le bouton.

    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
    public class PanelBoutonOk extends JPanel implements ActionListener
    {
        JButton ok = new JButton("Ok");
        JFrame frame;
     
        public PanelBoutonOk(JFrame f)  //Constructeur
        {
            frame = f;
            ok.addActionListener(this);
            add(ok);
        }
        public void actionPerformed(ActionEvent e) 
        {
            Object s = (JButton)e.getSource();
            if((JButton)s == ok)
            {
                frame.dispose();
                System.out.println("Bouton ok clické");
            }    
        }
    }

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Cela marche très bien!
    Je te remercie. Bonne journée.
    A+

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

Discussions similaires

  1. Comment fermer une fenêtre externe à l'application ?
    Par Matt2094 dans le forum Delphi
    Réponses: 8
    Dernier message: 30/08/2006, 16h52
  2. comment fermer la fenêtre principale sous IE ?
    Par renaudjuif dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/08/2006, 14h31
  3. Comment fermer une fenêtre dynamique avec onclose
    Par nopnop dans le forum Delphi
    Réponses: 23
    Dernier message: 18/07/2006, 18h08
  4. Comment fermer une fenêtre enfant MDI ?
    Par DeveloMagaly dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2005, 13h10
  5. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09

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