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 lignede ma classe MenuBar.
Code : Sélectionner tout - Visualiser dans une fenêtre à part parentComponent.dispose();
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.
Partager