Detruire objet JPanel et ce qu'il contient [Résolu]

poiuytrez3 150 Messages postés dimanche 28 septembre 2003Date d'inscription 17 mars 2009 Dernière intervention - 20 déc. 2004 à 12:26 - Dernière réponse : Madvin 123 Messages postés mardi 5 août 2003Date d'inscription 26 août 2012 Dernière intervention
- 20 déc. 2004 à 20:14
Bonjour,
J'ai fait un petit logiciel qui permet d'additionner des temps pour la course à pied. Cependant il y a un JPanel (l'espèce de tableau qui permet de rentrer les temps) qui doit être réinitialisé si l'utilisateur souhaite faire plus de tours.
Je ne sais pas comment détruire l'ancien JPanel car il est toujours à la porté du programme. Je souhaiterai détruire aussi tout ce qu'il contient (JTextFields, JLabels...). Merci de votre aide
Afficher la suite 

8 réponses

Répondre au sujet
poiuytrez3 150 Messages postés dimanche 28 septembre 2003Date d'inscription 17 mars 2009 Dernière intervention - 20 déc. 2004 à 18:55
+3
Utile
Ca marche! Je ne sais pas comment te remercier.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de poiuytrez3
indiana_jules 750 Messages postés mardi 9 mars 2004Date d'inscription 23 décembre 2008 Dernière intervention - 20 déc. 2004 à 13:45
0
Utile
Slut
Déjà, pour virer tout son contenu : monpanel.removeAll();

et pour le panel, ben tu l'écrases (brutal, mais efficace)
exemple:
JPanel p = new JPanel();
....
p = new JPanel(); //Tout ce que a été fait auparavent est écrasé


Voilà

[Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises]
Commenter la réponse de indiana_jules
poiuytrez3 150 Messages postés dimanche 28 septembre 2003Date d'inscription 17 mars 2009 Dernière intervention - 20 déc. 2004 à 14:24
0
Utile
C'est ce que je pensais mais pourtant ça marche pas, voilà mon code:

private void makeCenterPanel() // Crée le panneau central avec les temps
{
centerPanel = new JPanel();
centerPanel.setLayout(new GridBagLayout());
// Ajoute les nombres à la colonne
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;

// Crée et ajoute le titre de la colonne
JLabel lblTours = new JLabel("Tour n°");
c.gridx = 0;
c.gridy = 0;
centerPanel.add(lblTours, c);

// Crée et ajoute le titre de la deuxième colonne
JLabel lblMin = new JLabel("Minutes");
c.gridx = 1;
c.gridy = 0;
centerPanel.add(lblMin, c);

// Crée et ajoute le titre de la 3ème colonne
JLabel lblSec = new JLabel("Secondes");
c.gridx = 2;
centerPanel.add(lblSec, c);

// Crée et ajoute le titre de la quatrième colonne
JLabel lblTempsCumu = new JLabel("Temps cumulé");
c.gridx = 3;
centerPanel.add(lblTempsCumu, c);

// Crée 1ère colonne
for(int i = 1; i <= MAX; i++){
c.gridx = 0;
c.gridy = i;
centerPanel.add(new JLabel(i + ""), c);
}

// Crée la deuxième colonne
txtMin = new JTextField[MAX];

for(int i = 0; i < MAX; i++){
c.gridx = 1;
c.gridy = i + 1;
txtMin[i] = new JTextField();
txtMin[i].setText("00");
centerPanel.add(txtMin[i], c);
}

// Crée la 3èùe colonne
txtSec = new JTextField[MAX];
for(int i = 0; i <MAX; i++){
c.gridx = 2;
c.gridy = i + 1;
txtSec[i] = new JTextField();
txtSec[i].setText("00");
centerPanel.add(txtSec[i], c);
}

// Crée la 4ème colonne avec les temps cumulés
lblCumu = new JLabel[MAX];
for(int i = 0; i <MAX; i++){
c.gridx = 3;
c.gridy = i + 1;
lblCumu[i] = new JLabel("0:00:00");
lblCumu[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
centerPanel.add(lblCumu[i], c);
}
lblCumu[MAX-1].setBorder(BorderFactory.createLineBorder(Color.RED));

}
Commenter la réponse de poiuytrez3
poiuytrez3 150 Messages postés dimanche 28 septembre 2003Date d'inscription 17 mars 2009 Dernière intervention - 20 déc. 2004 à 14:26
0
Utile
En fait lorsque on clique sur calculer, ça lance makeCenterPanel() mais en changeant MAX...
Et le centerPanel parait figé...
Merci de ton aide.
Commenter la réponse de poiuytrez3
Madvin 123 Messages postés mardi 5 août 2003Date d'inscription 26 août 2012 Dernière intervention - 20 déc. 2004 à 14:41
0
Utile
Salut,

C'est parce que ton ancien JPanel a été ajouté dans ta fenêtre (je présume que tu l'as mis dans le contentPane) et que l'instruction "centerPanel = new JPanel();" au début de ta méthode makeCenterPanel() indique que la variable centerPanel ne référence plus maintenant le panel présent dans la fenêtre mais un nouveau panel.
Pour régler ce problème, il faut que tu enlèves l'ancien panel de ta fenêtre : (getContentPane(). peut-être ? faut voir dans quel conteneur tu l'as inséré) remove(centerPanel) avant d'effectuer l'instruction centerPAnel = new JPanel(). Ensuite, il te faut insérer le nouvel panel dans la fenetre (getContentPane()?).add(centerPanel). Et ne pas oublier de faire un repaint() sur le tout.

Voilà.

Et si tu veux que la taille de la fenêtre se réajuste en fonction du contenu de ton nouveau panel, appelle la méthode pack() sur ta fenêtre (JFrame ou Frame). ;)

En espérant que cela résoudra ton problème...

@++
Commenter la réponse de Madvin
poiuytrez3 150 Messages postés dimanche 28 septembre 2003Date d'inscription 17 mars 2009 Dernière intervention - 20 déc. 2004 à 15:03
0
Utile
J'obtiens vide lorsque je fais comme tu dis. Voilà le code qui est exécuté lorsque on clique sur le bouton:

MAX = Integer.parseInt(txtNbTours.getText());
mainPanel.remove(centerPanel);
makeCenterPanel();
mainPanel.add(centerPanel, BorderLayout.CENTER);
mainPanel.repaint();
centerPanel.repaint();


et la fenêtre devient comme ça:

Merci, c'est sympa de m'aider.
Commenter la réponse de poiuytrez3
Madvin 123 Messages postés mardi 5 août 2003Date d'inscription 26 août 2012 Dernière intervention - 20 déc. 2004 à 15:46
0
Utile
C'est à cause de ta gestion des repaint().

Fait plutôt comme ca, en appelant la méthode pack() sur ta fenêtre , tu verras ça le fait mieux ;) : ca redimensionne ta fenêtre en fonction de la taille de ses composants et ca la redessine aussi.

MAX = Integer.parseInt(txtNbTours.getText());
if (centerPanel != null) //Vaut mieux être prudent :)
    mainPanel.remove(centerPanel);
makeCenterPanel();
mainPanel.add(centerPanel, BorderLayout.CENTER);
pack(); //Si t'es dans la fenêtre sinon maFenetre.pack();


Ca devrait marcher maintenant.

@++
Commenter la réponse de Madvin
Madvin 123 Messages postés mardi 5 août 2003Date d'inscription 26 août 2012 Dernière intervention - 20 déc. 2004 à 20:14
0
Utile
Ben si tu me dis que tu es satisfait ça me suffit. :)

@++
Commenter la réponse de Madvin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.