Supprimer un composant swing après affichage.

Résolu/Fermé
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 - 23 janv. 2013 à 11:04
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 - 23 janv. 2013 à 17:33
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.



A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 janv. 2013 à 15:46
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
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
23 janv. 2013 à 16:35
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.
0
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
23 janv. 2013 à 16:37
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 janv. 2013 à 16:44
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);
}
0
ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
23 janv. 2013 à 17:33
Merci pour votre réponse, ça marché.
0