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

Agents de placement/Fenêtres Java Discussion :

comment caché un jframe à partir d'une classe interne?


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Points : 67
    Points
    67
    Par défaut comment caché un jframe à partir d'une classe interne?
    Bonjour,


    j'ai une fenêtre avec un bouton login, je veux tout simplement appeler une deuxième jframe à partir de la première en cliquant sur le bouton login.
    pour cela j'ai crée une classe interne dans ma fenêtre pour écouter mon bouton login.
    le problème est le suivent j'arrive bien à appeler l'autre jframe avec le code suivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JFrame2 jf =new JFrame2 ();
          jf.setVisible(true);
    par contre je n'arrive pas à cache ma fenêtre de connexion malgré que j'ai bien fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fenetre fe = new fenetre();
    fe.setVisible(false);
    et ceci me pousse à vous poser une deuxième question?
    étant donnée que ma classe interne est dans ma JFrame fenetre, pourquoi je suis obligé d'instancier la JFrame fenetre dans ma classe interne?
    pourquoi elle n'a pas une visibilité sur la JFrame mère, malgré qu'elle arrive même à voir les champs privates?

    merci pour votre aide.

    glasgow

  2. #2
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Si, justement, avec une classe interne tu as accès à l'ensemble de la classe (attribut, méthode), c'est un des avantages.

    D'après ce que tu décris, tu prends une nouvelle référence de Fenetre pour la fermer, ça ne eut pas marcher. Tu doit obtenir la référence de la fenêtre affichée. Pour cela tu utilise this, mais avec les classes interne il est nécessaire de préfixer this par le nom de la classe, histoire de savoir à quel objet tu fait référence.
    Si tu as une classe Classe1 et une classe interne Interne1, tu fait référence à l'intérieur de ta classe interne à l'instance de Classe1 par Classe1.this.quelquechose

    Voici un exemple. Tu clic sur le bouton de la frame, ça la rend invisible et affiche une autre frame. Lorsque tu ferme la seconde frame ça ré-affiche la première. Si ça peut t'aider...
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial")
    public class JPremiereFenetre extends JFrame {
     
    	public static void main(String[] args) {
    		JPremiereFenetre t = new JPremiereFenetre();
    		t.setLocationRelativeTo(null);
    		t.setVisible(true);
    	}
     
    	private JSecondeFenetre secondeFrame = new JSecondeFenetre();
     
    	public JPremiereFenetre() {
    		super("1");
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setSize(400, 400);
    		JButton btn = new JButton("open second frame");
    		btn.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				JPremiereFenetre.this.setVisible(false); // 1ère frame
    				JPremiereFenetre.this.secondeFrame.setLocationRelativeTo(JPremiereFenetre.this); // 2ème frame
    				JPremiereFenetre.this.secondeFrame.setVisible(true); // 2ème frame
    			}			
    		});
    		getContentPane().setLayout(new FlowLayout());
    		getContentPane().add(btn);
    	}
     
    	private class JSecondeFenetre extends JFrame {
     
    		public JSecondeFenetre() {
    			super("2");
    			setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    			setSize(200, 200);
    			JButton btn = new JButton("close");
    			btn.addActionListener(new ActionListener() {
    				@Override
    				public void actionPerformed(ActionEvent e) {
    					dispose();
    				}			
    			});
    			getContentPane().setLayout(new FlowLayout());
    			getContentPane().add(btn);
    		}
     
    		@Override
    		public void dispose() {
    			super.dispose();
    			JPremiereFenetre.this.setVisible(true); // 1ère frame
    		}		
     
    	}
     
    }

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    supposon que classe2 est interne a classe1,alors tu ajoute un attribut maClasse dans classe1 comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class classe1 extends JFrame
    {
    .......
      classe1 maClasse ;
     
     public classe1() // constructeur
       {
          .......
        maClasse = this;
         ........
       }
    }
    après dans classe2 qui est interne tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasse.setVisible(false);

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par glasgow Voir le message
    étant donnée que ma classe interne est dans ma JFrame fenetre, pourquoi je suis obligé d'instancier la JFrame fenetre dans ma classe interne?
    Attention, si tu instancies la JFrame fenêtre à nouveau tu ne fais qu'en créer une seconde, donc la première est inchangée et la seconde que tu crées est, elle, bien invisible.

    Nouvelle instance = objet différent ! Il ne faut jamais faire un "new" quand tu souhaites accéder à quelque chose d'existant.

    Les réponse au dessus devraient te permettre de t'en sortir. Enfin, surtout celle de visiwi qui montre le principe clairement, celle de slim_java est un peu bidouille (mais fonctionne...).
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

Discussions similaires

  1. Récupérer des valeurs dans une JFrame à partir d'une classe
    Par stratocasters dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 26/06/2012, 15h15
  2. Réponses: 2
    Dernier message: 01/07/2009, 10h57
  3. Réponses: 1
    Dernier message: 14/07/2008, 11h17
  4. Réponses: 1
    Dernier message: 04/07/2007, 06h44
  5. Réponses: 12
    Dernier message: 03/11/2005, 18h45

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