Supprimer un composant swing après affichage.

Résolu/Fermé
Signaler
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
-
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
-
Bonjour,
je debute en programmation java et j'ai créé une application swing qui affiche une fenetre, deux panel. le premier panel contient des JLabel, le second contient des JTextField, et un button action,
le resultat est bien attendu, mais ce que je voulais aussi faire disparaitre le second panel.
j'ai fait un
panel2.removeAll(); puis un panel2.validate() et j'ai appelé super.validate()
puisque ma classe etend le JFrame.
je me rend compte le panel est réellement supprimé en mémoire mais visiblement, il y ait tjour.
j'ai dû faire un panel2 = new JPanel(); et refaire un add() sur la fenetre pour faire réellement disparaitre le composant.
quelqu'un peut -il m'aider a faire disparaitre le composant panel sans réallocation de mémoire.
Merci d'avance pour vos réponse.



3 réponses

Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 919
Un remove suivi d'un repaint devrait suffire, pas besoin du reste.

Exemple :

public static void main(String[] args)
{
	final JFrame frame = new JFrame();
	
	final JLabel label = new JLabel("Je suis vivant",JLabel.CENTER);
	frame.add(label,BorderLayout.NORTH);
	
	final JButton button = new JButton("Tuer");
	frame.add(button,BorderLayout.SOUTH);
	
	button.addActionListener(new ActionListener()
	{
		@Override
		public void actionPerformed(ActionEvent e)
		{
			frame.remove(label);
			frame.repaint();
		}
	});
	
	frame.pack();
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
23
Merci pour ta réponse, mais le problème n'est pas de supprimé le composant panel2 de la fenetre, mais de vider son contenu. parce qu'il est reutilisé apré pour affiché autre chose. j'ai donc vidé le contenu du panel2 en faisant
panel2.removeAll()
, mais visiblement, ça n'enleve pas le contenu, mais en mémoire ça enleve, parce que quand je refait
panel2.remove(jtextfield2)
; il dit Null pointeur exception. cela veut dire que
jtextfield2
a bien été supprimé en mémoire, et bien ententu les autres composant, mais pas visiblement.Mon panel contient des jtextfield que j'aimerai enlever.
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
23
Merci KX, ton exemple marche parce que c'est simplement le JLabel et tu l'enleve de la fenetre. Pour mon cas, c'est un sous composant de la fenetre que je souhaite vider.il ya plusieurs panel dans le frame.getContentPane() d'une fenetre. alors, si l'on vider un de ces panels, les methodes removeAll() et validate() ne marche pas graphiquement?
Encore merci pour ton aide.
Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 919
Ma réponse va être la même : un remove et un repaint suffisent.

J'avais utilisé un exemple où le Container était la JFrame, et où le Component un Label, mais si tu préfères voici un exemple où le Container est un JPanel et les Component des JTextField, mais fondamentalement ça ne change rien :

public static void main(String[] args)
{	
	final JFrame frame = new JFrame();
	
	final JPanel panel = new JPanel();
	panel.add(new JTextField("Je suis vivant",JLabel.CENTER));
	panel.add(new JTextField("Moi aussi",JLabel.CENTER));
	frame.add(panel,BorderLayout.NORTH);
	
	final JButton button = new JButton("Tuer");
	frame.add(button,BorderLayout.SOUTH);
	
	button.addActionListener(new ActionListener()
	{
		@Override
		public void actionPerformed(ActionEvent e)
		{
			panel.removeAll();
			panel.repaint();
		}
	});
	
	frame.pack();
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Messages postés
426
Date d'inscription
dimanche 31 juillet 2011
Statut
Membre
Dernière intervention
17 février 2015
23
Merci pour votre réponse, ça marché.