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 :

Retrouver et fermer la JFrame depuis un JMenuItem


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut Retrouver et fermer la JFrame depuis un JMenuItem
    Bonjour.

    Je crée une petite application avec plusieurs fenêtres. Mes fenêtres ont la même barre de menu, j'ai donc créé une classe MenuBar (étendant JMenuBar) que j'ajoute à chacune de mes fenêtres, ceci afin de ne pas retaper tout le code de ma barre de menu dans chaque classe fenêtre.
    Dans cette barre, j'ai un menu "Fichier", dans ce menu, j'ai un JMenuItem "Nouveau".
    Je souhaite que lorsqu'on clique sur nouveau, ça ferme la fenêtre actuelle et ça ouvre une autre fenêtre (classe NewFrame pour l'exemple).
    Ouvrir la nouvelle fenêtre ne pose pas de problème. Par contre, je n'arrive pas fermer la fenêtre actuelle. En fait, je n'arrive pas à la "retrouver" depuis l'écouteur que j'ai mis sur le JMenuItem "Nouveau" dans ma classe "MenuBar". Voici les codes de mes classes :

    Code MenuBar : 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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
     
    public class MenuBar extends JMenuBar {
    	private JFrame parentComponent = new JFrame();
    	private JMenu fileMenu = new JMenu("Fichier");
    	private JMenuItem newMenuItem = new JMenuItem("Nouveau");
    	private JMenuItem closeMenuItem = new JMenuItem("Fermer");
     
    	public MenuBar() {
    		parentComponent = (MainFrame)this.getParent();
    		if (parentComponent != null)
    			System.out.println(parentComponent.getClass());
    		else
    			System.out.println("parentComponent est null");
     
    		closeMenuItem.addActionListener(new ActionListener() {
    	    	public void actionPerformed(ActionEvent arg0) {
    	    		System.exit(0);
    	    	}
    	    });
     
    	    newMenuItem.addActionListener(new ActionListener() {
    	    	public void actionPerformed(ActionEvent event) {
    			NewFrame nf = new NewFrame();
    			try {
    				parentComponent.dispose();
    			} catch(NullPointerException e) {
    				e.printStackTrace();
    			}
    	    	}
    	    });
     
    	    this.fileMenu.add(newMenuItem);
    	    this.fileMenu.add(closeMenuItem);
    	    this.add(fileMenu);
    	}
    }

    Code MainFrame : 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
    import javax.swing.JFrame;
     
    public class MainFrame extends JFrame {
    	private MenuBar menuBar = new MenuBar();
     
    	public MainFrame() {
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setTitle("Main Frame");
    		this.setSize(800, 600);
    		this.setLocationRelativeTo(null);
     
    		this.setJMenuBar(menuBar);
    		this.setVisible(true);
    	}
    }

    Code NewFrame : 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
    import javax.swing.JFrame;
     
    public class NewFrame extends JFrame {
    	private MenuBar menuBar = new MenuBar();
     
    	public NewFrame() {
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setTitle("New Frame");
    		this.setSize(400, 300);
    		this.setLocationRelativeTo(null);
     
    		this.setJMenuBar(menuBar);
    		this.setVisible(true);
    	}
    }

    Lorsque je clique sur Fichier -> Nouveau, cela ouvre bien la fenêtre "NewFrame" mais ça renvoie une exception NullPointerException à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parentComponent.dispose();
    de ma classe MenuBar.
    Le parentComponent est null (d'après la boucle de test "if"), il ne le "retrouve" pas, et c'est là le problème je pense.

    Comment retrouver le composant parent de mon MenuBar, à savoir ma MainFrame (ou autre fenêtre) depuis ma classe MenuBar, et le fermer ? Est-ce possible comme ça ou faut-il inclure le code du JMenuBar dans chaque fenêtre.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public MenuBar() {
       parentComponent = (MainFrame)this.getParent();
       if (parentComponent != null)
           System.out.println(parentComponent.getClass());
       else
          System.out.println("parentComponent est null"
    Tu ne peux pas procéder comme ça, à la construction : l'instance de MenuBar étant en cours de construction, elle n'a pas pu être ajoutée à un composant, donc n'a pas (encore) de parent. Elle en aura un seulement après l'appel de setMenuBar(). Et encore, il y a peu de chance que le parent du menu soit une JFrame qui sert surtout à l'interfaçage avec la frame native de l'os (en fait, c'est le LayeredPane de la JFrame qui contient les menus).

    Le plus simple pour faire ce que tu veux est de retrouver la frame parente au moment de la fermeture (avec SwingUtilities.getWindowAncestor). Exemple (je t'ai mis un menu en plus qui te permettra de constater que le parent n'est pas une JFrame) :

    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
    public class MenuBarExemple {
     
     
    	public static void main(String[] args) {
    		createFrame();
    	}
     
    	private static void createFrame() {
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.setJMenuBar(new MenuBar());
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true); 
     
    	}
     
    	public static class MenuBar extends JMenuBar {
     
    		public MenuBar() {
    			JMenu fileMenu = new JMenu("Fichier");
    			add(fileMenu);
    			JMenuItem openMenuItem = new JMenuItem("Ouvrir nouvelle fenêtre");
    			openMenuItem.addActionListener(e-> createFrame());
    			fileMenu.add(openMenuItem);
    			JMenuItem closeMenuItem = new JMenuItem("Fermer cette fenêtre");
    			closeMenuItem.addActionListener(e-> closeThisFrame());
    			fileMenu.add(closeMenuItem);
    			JMenuItem parentMenuItem = new JMenuItem("Print parent");
    			parentMenuItem.addActionListener(e-> System.out.println(this.getParent()));
    			fileMenu.add(parentMenuItem);
    		}
     
    		private void closeThisFrame() {
    			 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
    Membre averti
    Homme Profil pro
    Ingénieur process
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur process
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut
    Salut Joel.

    Merci pour la réponse et les explications. Ça fonctionne très bien.
    J'ai essayé en remplaçant cette ligne :
    Citation Envoyé par joel.drigo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openMenuItem.addActionListener(e-> createFrame());}
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    openMenuItem.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			createFrame();
    			closeThisFrame();
    		}
    	});
    pour créer une nouvelle fenêtre et fermer l'actuelle, et ça fait exactement ce que je veux !

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

Discussions similaires

  1. Comment fermer un JFrame depuis un autre JFrame
    Par rpedro0921 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 27/05/2014, 11h19
  2. fermer une popup depuis une autre page que l'opener
    Par totoche dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/12/2005, 14h31
  3. peut on fermer une JFrame automatiquement?
    Par zorm dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 22/11/2005, 16h12
  4. Fermer une fenêtre depuis une autre...
    Par nicolb dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/03/2005, 10h22
  5. [VB.NET] Fermer une popup depuis une webform ?
    Par Nycos62 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 27/04/2004, 10h19

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