IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Afficher un Jpanel en cliquant sur un autre Jpanel


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Afficher un Jpanel en cliquant sur un autre Jpanel
    Bonjour,

    j'ai une JFrame qui contient un JPanel principal, qui lui-même contient un JPanel (panneau1).
    J'aimerais quand on clique dans la zone du panneau1, afficher un JPanel (panneau2) au-dessous du panneau1.

    Mon problème est que quand je clique sur le panneau1, le panneau2 s'affiche correctement, mais à la place du panneau1 !!!! (à savoir en haut), alors que moi je veux qu'il s'affiche en bas du panneau1 !

    Pour la disposition, j'utilise des GridLayout :
    J'ai 3 classes :
    • une classe FenetrePrincipale qui contient un JPanel principal avec un GridLayout(2,1)
    • une classe R1, qui étend JPanel et qui permet l'affichage du panneau1, avec un GridLayout(1,1)
    • une classe R2 qui étend JPanel et qui permettra l'affichage du panneau2 (j'appelle son constructeur dans la classe R1) avec aussi un GridLayout(1,1)


    J'ai essayé de changer les GridLayout(1,1) en GridLayout(2,1), mais ça ne change rien...

    Pouvez-vous m'aider svp ?
    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Il va falloir que tu montres ton code, on ne peux pas deviner comment tu as affectés tes composants à tes layouts.

    L'utilisation d'un BorderLayout ne conviendrait-elle pas mieux ?

    Fred

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    En essayant de modifier les tailles des panels (avec les setSize), j'ai vu que seule la partie haute du panneau principal de la JFrame était utilisé pour afficher le panneau1 et le panneau2...

    Citation Envoyé par kwxyz
    L'utilisation d'un BorderLayout ne conviendrait-elle pas mieux ?
    Au départ, j'utilisais un BorderLayout, mais la partie nord était trop "petite", ça ne me convenais pas (ou bien peut-être que je ne l'utilisais pas correctement ).

    Voici mon code :
    La classe pour la fenêtre principale :

    Code : 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
    /** Classe contenant le code qui gere l'aspect general de la fenetre de l'application **/
    import javax.swing.*;
    import java.awt.*;
     
    public class FenetrePrincipale extends JFrame
    {
    	public FenetrePrincipale()
    	{
    		super();
    		build();	//on initialise la fenetre
    	}
     
    	private void build()
    	{
    		setTitle("Deux rectangles");
    		setSize(850,720);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane()
    	{
    		JPanel panneau_princ = new JPanel();  //panneau principal de la JFrame
     
    		panneau_princ.setLayout(new GridLayout(2,1));
    		panneau_princ.setBackground(Color.WHITE);
     
    		R1 panneau1 = new R1();       //creation du panneau1
     
    		panneau_princ.add(panneau1); //ajout du panneau1 au panneau principal
     
    		return panneau_princ;
    	}
    }

    La classe R1 (qui construit un objet de la classe R2) :

    Code : 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
     
    public class R1 extends JPanel 
    {	
    	//Le Panel qui contiendra une instance de la classe R2
    	private JPanel panneau2;
     
            (...)
     
    	//Dimensions initiales du panel
    	float largInitiale;
    	float hautInitiale;
     
    	/** Constructeur **/
    	public R1()
    	{
    		setSize(new Dimension(750,400));
    		setLayout(new GridLayout(2,1));
    		setBackground(Color.RED);
     
    		largInitiale = getWidth();
    		hautInitiale = getHeight();
     
     
                    /** Gestion du clic **/
    		addMouseListener(	new MouseAdapter()
    						{
                                                        public void mouseClicked(MouseEvent e)
    						    {
    						      if(SwingUtilities.isLeftMouseButton(e))
    	                                                         clicGaucheAction(e);
    					               else
    								 clicDroitAction(e);
    							repaint();
    						    }
    						});
    	}
     
    	public void clicGaucheAction(MouseEvent e)
    	{
    		System.out.println("Clic GAUCHE détecté en ("+e.getX()+","+e.getY()+").");
     
                    //Calcul de x1 et x2
                    (...)
    		panneau2 = new R2(x1, x2);   //creation du panneau2 en instanciant la classe R2
    		this.add(panneau2);          //ajout du panneau2 au panneau1
     
    		this.revalidate();
    		this.repaint();			
    	}
     
     
    	public void clicDroitAction(MouseEvent e)
    	{
    		System.out.println("Clic DROIT détecté.");
    	}
     
     
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    	        //Affichage du rectangle1
                    (...)
    	}
    }

    Puis la classe R2 :

    Code : 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
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
     
    public class R2 extends JPanel
    {
    	//Variables privees
            private int X1;
            private int X2;
     
            (...)
     
    	//Dimensions initiales du panel
    	float largInitiale;
    	float hautInitiale;
     
    	public R2(int X1, int X2)
    	{
    		this.X1 = X1;
    		this.X2 = X2;
     
    		setSize(new Dimension(750,600));
    		setBackground(Color.CYAN);
    		setLayout(new GridLayout(1,1));
     
    		largInitiale = getWidth();
    		hautInitiale = getHeight();
            }
     
     
            public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
                    //Dessin du rectangle 2
                    (...)
            }
    }
    Avant que je ne m'occupe du clic, je créais un panel panneau1 et un panel panneau2 dans FenetrePrincipale (et non pas le panneau2 dans la classe R2 comme je souhaiterais le faire maintenant).
    Je faisais :
    Code : 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
    public class FenetrePrincipale extends JFrame
    {
    	(...)
    	private JPanel buildContentPane()
    	{
    		JPanel panneau_princ = new JPanel();
    		panneau_princ.setLayout(new GridLayout(2,1));
    		panneau_princ.setBackground(Color.WHITE);
     
    		R1 panneau1 = new R1();		
    		R2panneau2 = new R2();
     
    		panneau_princ.add(panneau1);
    		panneau_princ.add(panneau2);
     
    		return panneau_princ;
    	}
    }
    et ça m'affichait les 2 panneaux au bon endroit (panneau1 au dessus de panneau2)...
    Le problème vient du fait que je construis le panneau2 dans R1 et que je l'ajoute au panneau1 et non plus au panneau_principal.
    Mais là, je ne sais plus trop quoi modifier...

    Merci d'avance pour votre aide.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    en effet, avant, tu ajoutais ton panneau R2 dans ta JFrame, et ça marchait très bien. Maintenant, tu ajoutes ton panneau R2 dans le panneau R1.

    Pour avoir les deux panels qui s'affiche, soit tu passes "panneau_princ" comme paramètre au constructeur de R1 et dans clicGaucheAction tu fais panneau_princ.add(panneauR2) au lieu de this.add(panneauR2)

    soit, tu changes un peu ta classe R1 en faisant un truc du genre :
    Code : 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
     
    class R1 extend JPanel {
        public R1() {
          super();
          setLayout(new GridLayout(2,1);
          JPanel sousPanel = new JPanel();
          sousPanel.setSize(...);
          sousPanel.setBackground(...);
          sousPanel.setMouseListener(...);
          this.add(sousPanel);
        }
        private clicGaucheAction() {
          R2 panelR2 = new R2(...);
          this.add(panelR2);
          this.revalidate();
          this.repaint();
        }
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut ça y'est ! presque....
    merci mobi38 pour ta réponse,

    Pour avoir les deux panels qui s'affiche, soit tu passes "panneau_princ" comme paramètre au constructeur de R1 et dans clicGaucheAction tu fais panneau_princ.add(panneauR2) au lieu de this.add(panneauR2)
    Comme ça, ça marche , je clique une fois sur mon panneau1, et mon panneau2 s'affiche bien au-dessous du panneau1

    Mais ( ), quand je clique une 2ème fois sur le panneau1, je voudrais que le panneau2 se mette à jour (un nouveau rectangle se dessine à l'intérieur), or là, je clique une 2ème fois sur le panneau1 et la fenêtre se divise en 4 !!!
    Puis je clique une 3ème fois sur le panneau1, et la fenêtre se divise... en 6 !!!!!!

    Je ne comprend rien à ce qui se passe : on dirait qu'il y a à chaque clic un nouveau panel (panneau2) qui apparait !

    Toute aide serait la bienvenue
    Merci d'avance.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par SeaShell Voir le message
    Mais ( ), quand je clique une 2ème fois sur le panneau1, je voudrais que le panneau2 se mette à jour (un nouveau rectangle se dessine à l'intérieur)
    comment ca?
    Citation Envoyé par SeaShell Voir le message
    Je ne comprend rien à ce qui se passe : on dirait qu'il y a à chaque clic un nouveau panel (panneau2) qui apparait !.
    c'est bien ce qui se passe. A chaque fois que tu clique sur ton panneau1, tu rajoutes un panneau R2 à ta frame (c'est ce que te dis le mouseListener)

    mobi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    merci de ton aide mobi

    en fait, j'aimerais toujours avoir 2 panels dans ma fenêtre : le panneau1 en haut et le panneau2 en bas.

    Ces 2 panneaux contiennent des rectangles, et je voudrais que lorsqu'on clique sur un des rectangles du panneau1, un nouveau rectangle s'affiche dans le panneau2 (en fait je voudrais qu'à chaque clic dans le panneau1, le panneau2 se "réactualise" en dessinant un nouveau rectangle à l'intérieur à la place de l'ancien)

    Je ne sais pas si mes explications sont très claires...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2003
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    il faut alors que tu gardes une référence sur ton panel R2 et que tu ais un booléen t'indiquant si ton panel R2 est affiché.

    et tu définie ta méthode clicGaucheAction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private clicGaucheAction() {
      if(!estAffichee) {
        panelR2 = new R2();
        panneau_princ.add(panelR2);
        panneau_princ.revalidate();
        panneau_princ.repaint();
      } else {
        panelR2.mettreAJour();
      }
    }
    mobi

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    D'accord, mais alors pour faire la méthode miseAJour(), comment je peux faire pour redessiner dans le panel R2 (puisque c'est la méthode paintComponent() de la classe R2 qui dessine dans le panel R2), je ne peux pas rappeler paintComponent de R2... ?

    Et si je peux, quel Graphics lui passer en paramètre ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut problème résolu :)
    comment je peux faire pour redessiner dans le panel R2 (puisque c'est la méthode paintComponent() de la classe R2 qui dessine dans le panel R2), je ne peux pas rappeler paintComponent de R2... ?
    Finalement, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private clicGaucheAction() {
      if(!estAffichee) {
        panelR2 = new R2();
        panneau_princ.add(panelR2);
        panneau_princ.revalidate();
        panneau_princ.repaint();
      } else {
        panneau_princ.remove(panelR2);
        panelR2 = new R2();
        panneau_princ.add(panelR2);
        panneau_princ.revalidate();
        panneau_princ.repaint();
      }
    }
    dans le else, j'efface du panneau principal le panelR2, et j'en re-crée un nouveau, que je rajoute à panneau_princ.
    Et ça me donne bien ce que je voulais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/12/2008, 18h06
  2. Réponses: 0
    Dernier message: 05/05/2008, 00h12
  3. [débutant] afficher une JFrame en cliquant sur un bouton
    Par 7rouz dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/03/2007, 12h22
  4. [VBA-E] afficher un ALERT en cliquant sur une case d'excel
    Par Argorate dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/08/2006, 06h02
  5. Jpanels les un sur les autres avec Matisse (Netbeans)
    Par vallica dans le forum Composants
    Réponses: 13
    Dernier message: 28/11/2005, 23h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo