Insérer un JPanel dans un autre JPanel lors d'un click

Résolu/Fermé
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - Modifié le 20 mars 2020 à 18:26
lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 - 21 mars 2020 à 13:41
Bonjour à tous, je tente d'insérer un rond ou un carré en fonction du bouton sur le quel on click dans un JPanel.

Pour ce faire, j'ai codé un bout de programme qui fonctionne à la seul et unique condition,que je redimensionne ma fenêtre 1 fois pour chaque éléments.

Voici mon code:

package testClick;
 
public class Main
{
    public static void main(String arg[])
    {
        Fenetre fenetre = new Fenetre();
    }
}


package testClick;
 
import java.awt.Color;
import java.awt.Graphics;
 
import javax.swing.JPanel;
 
public class Rond extends JPanel
{  
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.fillOval(150, 150, 200, 200);
         
        System.out.println("class Rond ligne 17");
    }
}



package testClick;
 
import java.awt.Color;
import java.awt.Graphics;
 
import javax.swing.JPanel;
 
public class Carre extends JPanel
{  
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.fillRect(150, 150, 200, 200);
         
        System.out.println("class Carre ligne 17");
    }
}


package testClick;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class Fenetre extends JFrame
{
    private JPanel conteneur = new JPanel();
    private JPanel hautDePage = new JPanel();
    private JPanel panelBouton = new JPanel();
    private JButton bCarre = new JButton("CARRE");
    private JButton bRond = new JButton("ROND");
    private JLabel titre = new JLabel("ClickTest");
    private Carre carre = new Carre();
    private Rond rond = new Rond();
     
    public Fenetre()
    {
        this.setTitle("ClickTest");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.hautDePage.setBackground(Color.YELLOW);
        this.conteneur.setBackground(Color.WHITE);
         
        this.bRond.addActionListener(new rondListener());
        this.bCarre.addActionListener(new carreListener());
        this.panelBouton.add(bRond);
        this.panelBouton.add(bCarre);
         
        this.conteneur.setLayout(new BorderLayout());
         
        this.hautDePage.add(this.titre);
        this.conteneur.add(this.hautDePage, BorderLayout.NORTH);
        this.conteneur.add(this.panelBouton, BorderLayout.SOUTH);
         
        this.setContentPane(conteneur);
    }
     
    class rondListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            conteneur.remove(carre);
            conteneur.add(rond);
            repaint();
            System.out.println("Rond");
        }
    }
     
    class carreListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            conteneur.remove(rond);
            conteneur.add(carre);
            repaint();
             
            System.out.println("Carre");
        }
    }
}



Donc si je commence par cliquer sur Rond, le println() qui est dans la classe rond ne s'affiche pas dans la consol et donc pas de rond a l'écran. idem si je commence par cliquer sur carre.

par contre si je clique sur un bouton et que je redimensionne la fenêtre alors ça fonctionne. Et une fois que j'ai redimensionné la fenêtre pour chaque bouton après c'est bon ça fonction tout le temps, plus besoin de redimensionner.

Du coup ma question, comment faire pour qua ça fonctionne sans que l'on soit obligé de redimensionner la fenêtre???
A voir également:

1 réponse

lamouchetsetse Messages postés 112 Date d'inscription samedi 2 août 2014 Statut Membre Dernière intervention 21 septembre 2021 2
21 mars 2020 à 13:41
Bon du coup j'ai fini par trouver une solution, je ne sais pas si cette façon de faire est convenable, mais ça fonctionne.
il faut simplement ajouter validate() dans l'évènement comme ceci:

class carreListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			conteneur.remove(rond);
			conteneur.add(carre);
			conteneur.validate();
			conteneur.repaint();
			
			System.out.println("Carre");
		}
	}
0