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

 Java Discussion :

Problème fermeture fenêtre (frame.dispose())


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 113
    Par défaut Problème fermeture fenêtre (frame.dispose())
    Bonjour,
    mon problème est que je n'arrive pas à fermer ma fenêtre, je sais qu'il faut utiliser frame.dispose() mais je dois faire quelque chose de mal car il me souligne en rouge frame et dispose() en marquant "Cannot find symbol"
    Voici mon code :

    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
    30
    31
    32
    33
    34
    35
    public static void main() {
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() {
    				JFrame frame = new JFrame();
    				SelectCourb inst = new SelectCourb();
    				frame.getContentPane().add(inst);
    				((JComponent)frame.getContentPane()).setPreferredSize(inst.getSize());
    				frame.pack();
    				frame.setVisible(true);
                                    System.out.println("Test");
    			}
    		});
     
    	}
     
    	public SelectCourb() {
    		super();
    		initGUI();
    	}
     
    	private void initGUI() {
    		try {
    			GroupLayout thisLayout = new GroupLayout((JComponent)getContentPane());
    			getContentPane().setLayout(thisLayout);
    			setSize(new Dimension(400, 300));
    {
    				jButton1 = new JButton();
    				jButton1.setText("Valider");
                                    jButton1.addActionListener(new java.awt.event.ActionListener() {
                                        public void actionPerformed(java.awt.event.ActionEvent evt) {
                                        frame.dispose(); 
                                        }
                                    });
    			}
    ...................................
    Voila je vous remercie d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    Il n'y a pas de variable frame definie dans la classe. Dans ton code, ta seule variable frame est locale a la methode run() du Runnable dans ton main().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 113
    Par défaut
    ça ne marche toujours pas il ne connait pas la méthode, j'avais essayé this.dispose()

    Donc ce qui veut dire que si je veux fermer cette fenêtre il va falloir que je le fasse à partir du run ? ou que je déplace mon ouverture de frame dans :

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 42
    Par défaut
    Bonjour,

    Tu ne peux pas appeler dispose() dans ta méthode actionPerformed() puisque tu te trouves alors dans l'ActionListener anonyme. "this" se réfère alors à lui. Tu peux référencer le this de ta fenêtre en préfixant "this" par le nom de la classe de ta fenêtre. Ainsi, si la classe de ta fenêtre est "MyWindow", tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyWindow.this.dispose();

  5. #5
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Citation Envoyé par Eric73 Voir le message
    Bonjour,

    Tu ne peux pas appeler dispose() dans ta méthode actionPerformed() puisque tu te trouves alors dans l'ActionListener anonyme. "this" se réfère alors à lui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyWindow.this.dispose();
    ou bien ne pas utiliser une classe anonyme et créer une classe " private implements ActionListener "

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 42
    Par défaut
    Bonjour,

    ou bien ne pas utiliser une classe anonyme et créer une classe " private implements ActionListener "
    Non, car cela ne changerait rien à son problème : il n'aura toujours pas accès à la référence de sa fenêtre directement, si ce n'est qu'en plus il aura créé une classe (qu'il devra nommer) exprès. L'intérêt des classes anonymes (et bientôt, des closures) est justement de ne pas s'embêter à créer des classes pour des choses aussi triviales. D'autant que pour ce cas, ça réduit même la lisiblité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jButton1.addActionListener(new MyListener());
    Que fait MyListener ? Il faut aller voir pour le savoir. Et dans MyListener, il faudra bien qu'il écrive ça, comme dans la classe anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyWindow.this.dispose();

  7. #7
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Citation Envoyé par Eric73 Voir le message
    Non, car cela ne changerait rien à son problème
    pourquoi j'ai mis private ?
    ben tous simplement pour dire que la classe qu'il va créer sera interne et dans ce cas tout est arrangé avec un petit dispose().

    ( je dois apprendre a être explicite)

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Eric73 Voir le message
    Bonjour,

    Tu ne peux pas appeler dispose() dans ta méthode actionPerformed() puisque tu te trouves alors dans l'ActionListener anonyme. "this" se réfère alors à lui. Tu peux référencer le this de ta fenêtre en préfixant "this" par le nom de la classe de ta fenêtre. Ainsi, si la classe de ta fenêtre est "MyWindow", tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyWindow.this.dispose();
    le this n'est pas nécesaire. Ni le MyWindow. Ce code devrais fonctionner sans problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MyFrame extends JFrame{
      .....
      button.addActionListener(new ActionListener(){
           ...
           dispose();
           ...
      }
      .....
    }
    }
    Car les inner class voient toutes les méthodes de la outer class. Le problème de départ c'est que frame n'est pas visible. Et pour cause, frame est une variable locale à la méthode main. Tout le monde a l'air de supposer que sa classe étend JFrame, ce qui n'est pas le cas il me semble. Une solution est de faire ceci


    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
     
    // main
    				JFrame frame = new JFrame();
    				SelectCourb inst = new SelectCourb(frame);
    //....
    //constructeur
            private JFrame parent;
    	public SelectCourb(JFrame parent) {
                    this.parent=parent;
    		initGUI();
    	}
    // initGui (on change frame en parent)
     
                                    jButton1.addActionListener(new java.awt.event.ActionListener() {
                                        public void actionPerformed(java.awt.event.ActionEvent evt) {
                                        parent.dispose(); 
                                        }
                                    });

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 42
    Par défaut
    Salut,

    Mmh en effet tchize_, j'avoue ne pas avoir pensé un instant que sa classe pouvait ne pas être une JFrame. C'est pour ça que j'ai pensé qu'il était nécessaire de préfixer. Autant pour moi .

Discussions similaires

  1. [WD18] Problème fermeture fenêtre contenant un champ fenêtre interne
    Par fdelepine dans le forum WinDev
    Réponses: 5
    Dernier message: 15/02/2013, 19h55
  2. Problème fermeture fenêtre OpenGL
    Par KuroOz dans le forum VB.NET
    Réponses: 1
    Dernier message: 11/02/2011, 14h28
  3. Problème fermer fenêtre avec dispose()
    Par BBreaker dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 10/10/2010, 19h32
  4. Problème fermeture de fenêtre
    Par jbidou88 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 26/04/2006, 18h03
  5. Problème d'affichage: fenêtres (frames) vides!
    Par NdmaX dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 12/07/2005, 22h23

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