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

 Java Discussion :

Affichage de différents JPanel dans une JFrame


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut Affichage de différents JPanel dans une JFrame
    Bonjour,

    je souhaiterais afficher différents JPanel dans une JFrame.
    Mes Jpanel sont dans des classes séparées, avec des constructeurs différents. Le tout contrôlé depuis ma classe MenuBar.
    Ma JFrame dispose de plusieurs JMenu et suivant quel JMenuItem est cliqué, j'aimerais afficher un JPanel à la fois dans ma JFrame.

    Pour le moment je n'y arrive pas...

    voici le code de ma JFrame :

    Code java : 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
     
    	public Home()
    	{			    
    		setSize( 600,600 ) ;
    		setLocationRelativeTo(null);
    		setResizable(false);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
    		setContentPane(labelHome);
     
    		labelHome.setLayout(new BorderLayout());
     
    		this.setJMenuBar(new BarreDeMenu());
     
    		this.setVisible(true);
    	}
     
    	public JLabel getLabelHome()
    	{
    		return labelHome;
    	}
     
    	public void setLabelHome(JLabel labelHome)
    	{
    		this.labelHome = labelHome;
    	}
     
    	public JPanel getPanelHome()
    	{
    		return panelHome;
    	}
     
    	public void setPanelHome(JPanel panelHome) 
    	{
    		this.panelHome = panelHome;
    	}
    }

    Ici, une de mes classes qui extends de JPanel :

    Code java : 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
     
    	public class Panel1 extends JPanel
    {
    	private static ButtonGroup groupeCheckBox = new ButtonGroup();
     
    	private JRadioButton   ajouter			= new JRadioButton	 ("Ajouter");
    	private JRadioButton   modifier			= new JRadioButton	 ("Modifie");
    	private JRadioButton   supprimer		= new JRadioButton	 ("Supprimer");
     
    	public Panel1()
    	{
    		this.setLayout(new GridLayout(3, 1));
    		this.add(ajouter);
     
    		this.setBorder(BorderFactory.createTitledBorder("Choix"));
     
    		ajouter.setSelected(true);
     
    		groupeCheckBox.add(ajouter);
     
    		groupeCheckBox.add(modifier);
     
    		groupeCheckBox.add(supprimer)
     
    		this.add (ajouter);
    		this.add (modifier);
    		this.add (supprimer);
    	}
    }

    ET là, ma classe BarreDeMenu qui extends de JMenuBar et implements ActionListener, pour l'écoute de mes JMenuItem.

    Code java : 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
    public class BarreDeMenu extends JMenuBar implements ActionListener
     
    {
               public void actionPerformed(ActionEvent bouton) 
    	{
    		if (bouton.getSource().equals(ajouter))
    		{
     
                         home.getLabelHome().add(panel1 , BorderLayout.WEST);
    		}
     
                    if (bouton.getSource().equals(modifier))
    		{
     
                         home.getLabelHome().add(panel2 , BorderLayout.WEST);
    		}
     
                    if (bouton.getSource().equals(supprimer))
    		{
                        home.getLabelHome().add(panel3 , BorderLayout.WEST);
    		}
            }
    }


    Donc, ici j"instancie une seconde JFrame (Home) en plus de la 1ere...
    Par contre, cette seconde JFrame (Home) a bien mon panel1 dedans.

    Mais je veux uniquement le panel sélectionné dans cette unique JFrame.
    Surtout ne pas pouvoir ré-instancier le même JPanel et détruire les anciens JPanel, et ne pas les masquer en les superposant.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    je comprends rien à ce que tu dis à la fin, mais pour afficher un seul JPanel à la fois parmi une liste de JPanel, tu peux utiliser un CardLayout.

    C'est un peu le principe d'un jeu de cartes, posées les unes sur les autres (en tas), vues du dessus : tu ne vois qu'une seule des cartes à la fois (celle du dessus), et tu peux choisir à tout moment celle que tu veux mettre au dessus.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    j'ai édité.

    Mais c'est justement ce Switch que je ne sais pas gérer.

    Qu'est ce que tu ne comprends pas ? J'essayerai d'être plus clair.

    Au clic du bouton, j'ai une nouvelle JFrame(Home) qui s'instancie qui contient bien le panel que j'ai sélectionné (via le bouton qui lui correspond);
    J'ai 3 JPanels différents à switcher.
    Donc je me retrouve avec 2 interfaces graphiques, dont une qui ne contient qu'un JMenuBar.

    Or, je ne souhaite pas instancier les 3 JPanels en même temps, ce qui n'aurait aucun sens...

    Ce que tu n'as peut être pas compris dans ma phrase ( détruire les anciens JPanel) c'est un semblant de garbageCollector pour les détruire, histoire de pas encombrer la mémoire.

    voilà;
    Merci de m'avoir indiqué cette piste

    édite :
    voir mes "actionPerformed"

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par PROJECT-AURORA Voir le message
    j'ai éditer.

    Mais c'est justement ce Switch que je ne sais pas gérer.
    Switch ?

    Citation Envoyé par PROJECT-AURORA Voir le message
    Qu'est ce que tu ne comprends pas ? J'essayerais d'être plus claire.
    Tout ça :

    Citation Envoyé par PROJECT-AURORA Voir le message
    Donc, ici j"instancie une seconde JFrame (Home) en plus de la 1er...
    Par contre cette seconde JFrame (Home) à bien mon panel1 dedans.

    Mais je veux uniquement le panel sélectionné dans cette unique JFrame.
    Surtout ne pas pouvoir ré-instancier le même JPanel et détruire les anciens JPanel, non pas les masquer en les superposant.
    Tu créés une seconde frame, ok. Par contre ? Pour quoi par contre ? Par contre quoi ?
    Ensuite tu dis que cette seconde JFrame à bien panel1 dedans, donc pas de problème, non ?

    Ensuite tu parles de "cette unique JFrame" : il y'a 2 JFrames, une première et une seconde, comment pourrait il y avoir "cette unique JFrame"... ca n'a pas de sens : c'est comme dire "j'ai 2 chemises et elle est verte" ou dire "Quelle est la différence entre un pigeon ?"

    Surtout Ne pas pouvoir ré-instancier le même JPanel ? pareil, c'est quoi le sens ? Ce ne serait pas Ne pas devoir réinstancier...

    Tu veux remplacer un JPanel par un autre ? c'est ça ?

    Citation Envoyé par PROJECT-AURORA Voir le message
    Au clic du bouton j'ai une nouvelle JFrame(Home) qui s'instancie qui contient bien le panel que j'ai sélectionné (via le bouton qui lui correspond);
    J'ai 3 JPanel différent à switcher.
    Donc je me retrouve avec 2 interfaces graphique, dont une qui ne contient qu'un JMenuBar.
    Tu veux une frame ou 2 ?

    Citation Envoyé par PROJECT-AURORA Voir le message
    Hors je ne souhaite pas instancier les 3 JPanel en même temps, ce qui n'aurais aucun sens...
    voilà;
    Attention, instancier, ce n'est pas afficher : tu peux très bien instancier 3 JPanel et en afficher qu'un seul des trois. Surtout si le but est de passer de l'un à l'autre... autant les instancier tous, et les afficher alternativement

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par PROJECT-AURORA Voir le message
    Ce que tu n'as peut être pas compris dans ma phrase ( détruire les anciens JPanel) c'est un semblant de garbageCollector pour les détruire, histoire de pas encombré la mémoire.
    Je ne sais pas pourquoi tu cherches à supprimer tes jpanel de la mémoire mais admettons.

    Si tu as besoin de supprimer un jpanel de la mémoire, il suffit de perdre toute référence dessus (donc si tu as une variable qui pointe dessus, tu mets null dedans) : ça ne le supprimera pas vraiment de la mémoire, ça le rendra supprimable de la mémoire par le Garbage Collector quand il décidera qu'il a besoin de le faire).

    Maintenant, à moins que tu aies des grosses images, un jpanel ça prend pas grand chose en mémoire, et si tu as un pc normal, ça sert pas à grand chose de le faire, surtout si tu alternes 3 jpanels entre eux : tu vas perdre du temps à recréé les panels chaque fois que nécessaire pour gagner 500 octets ou peut être moins...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par PROJECT-AURORA Voir le message
    voir mes "actionPerformed"
    Bah j'ai vu que à priori chaque menu met un panel différent (vu qu'il y a trois variables, panel1, panel2, panel3, je suppose qu'il s'agit de trois panels différents) au même endroit d'un borderlayout (WEST), ce qui correspond bien à l'affichage alternatif de 3 panels au même endroit :

    la raison pour laquelle je ne comprend pas ton problème, puisqu'il semble que tu demandes comment afficher 3 panels différents au même endroit, et que c'est ce que tu fais dans ton code...donc je me dis que j'ai pas compris la question

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    je parle de JFrame pour la bonne et simple raison que mon code est faux

    Quand je run l’exécutable, j'ai une JFrame (là, OK)
    mais quand je clique sur un de mes 3 JMenuItem (donc, pour afficher un de mes 3 JPanels) Une seconde JFrame apparait.
    Là est tout le problème. Concernant la mémoire ce n'est qu'incompréhension de ma part, tout comme le terme instancier ( )

    oui, je veux une et une seule JFrame. Et alterner (Switcher) entre mes 3 JPanels.

    Imagine que sur la calculatrice de windows, à chaque pression d'un bouton une nouvelle fenêtre apparaissait, tu imagines

    voilà, désolé si je me suis mal exprimé, mes explications me paraissaient pourtant simples. Débutant je suis simplement encore une peu hésitant, pas si simple l'objet...

    Il est tard donc, je vous dis à tous merci et à demain

    nenuit

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ok, je comprends mieux.

    Bon, il y a un petite erreur dans le code que tu as posté, que j'avais pas vu cette nuit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (bouton.getSource().equals(ajouter))
    		{
     
                         home.getLabelHome().add(panel1 , BorderLayout.WEST);
    		}
    La en rouge ça doit être getPanelHome(); parce que avec getLabelHome() tu mets ton panel dans un label, pas dans un panel.

    Ce qui est bizarre du coup, c'est que tu ne devrais même pas voir tes panels.

    Et je ne vois aucun code qui pourrais ouvrir une nouvelle JFrame : il faut forcément un new JFrame() pour avoir une nouvelle fenêtre.

    Cherches dans ton code ou il y aurait un new JFrame(). Postes le pour que je puisse te dire ou se trouve ton problème.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    home.getPanelHome().add(panel1 , BorderLayout.WEST)
    salut,
    Je me suis planté dans mon copier/coller je fais bien getPanelHome
    Je n'ai copié qu'une partie et non la totalité...


    édite :

    Pour mon code je post tout en quote ici, ou je le zip ? (je ne voudrais pas surcharger le forum...)


  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par PROJECT-AURORA Voir le message
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    home.getPanelHome().add(panel1 , BorderLayout.WEST)
    salut,
    Je me suis planté dans mon copier/coller je fait bien getPanelHome
    Je n'ai copier qu'une partie et non la totalité...


    édite :

    Pour mon code je post tout en quote ici, ou je le zip ? (je ne voudrais pas surchargé le forum...)

    En zip, si c'est pas non plus des GiB

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Mp envoyé

    merci....

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Yep,
    je commence à m'en sortir...
    Avec ce code j'arrive bien à afficher mes panels (1/2/3) dans une seule et même JFrame (ma classe Home)
    mais pour le remove du panelHome avant un ré affichage je galère encore...
    En fait il s'empile ! Mais je progresse



    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                       Home.getPanelHome().remove(Home.getPanelHome());
    			Home.getPanelHome().add(new Panel() ,  BorderLayout.WEST);     
     			Home.getPanelHome().validate();

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par PROJECT-AURORA Voir le message
    Yep,
    je commence à m'en sortir...

    Avec ce code j'arrive bien à afficher mes panels (1/2/3) dans une seule et même JFrame (ma classe Home)
    Bravo : c'est mieux de s'en sortit tout seul... ça montre que tu progresses...
    J'ai plus besoin de regarder le code qu'il y a dans le zip alors ?

    Citation Envoyé par PROJECT-AURORA Voir le message
    mais pour le remove du panelHome avant un ré affichage je galère encore...
    En fait il s'empile ! Mais je progresse



    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                       Home.getPanelHome().remove(Home.getPanelHome());
    			Home.getPanelHome().add(new Panel() ,  BorderLayout.WEST);     
     			Home.getPanelHome().validate();

    la je comprend pas trop pourquoi tu fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Home.getPanelHome().remove(Home.getPanelHome());
    Tu cherches à retirer ton panelHome de ton panelHome, or il n'est pas possible pour un composant d'être mis dans lui même. Donc l'enlever ne sert à rien.

    A mon avis, là tu cherchais à supprimer le panel ajouté précédemment. Ce qui serait plus facile si tu conservais une référence sur ce panel. Tu peux faire un truc comme ça sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(Component component : Home.getPanelHome().getComponents()) {
      if (((BorderLayout)Home.getPanelHome().getLayout()).getConstraints(component))==BorderLayout.WEST) {
        Home.getPanelHome().remove(component);
        break;
      }
    }

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    lu,
    Tu n'es plus obligé de fouiller mes srcs

    Je vais voir du coté d'une boucle for comme tu me l'as expliqué !
    Par contre les comportements de l'objet Component me sont encore complètement inconnu, je vais chercher de la doc dans cette direction...

    Et c'est vrais que trouver "seul" est super gratifiant j'étais vraiment bloqué et là, d'un coup ça redonne la pêche.

    Même si ce n'es pas encore fini,fini... Merci pour ton soutien

Discussions similaires

  1. Ajout et affichage d'un JPanel dans une JFrame lorsqu'un évènement se produit
    Par bilou_12 dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 27/03/2012, 20h27
  2. Affichage de différent MXML dans une seule page
    Par mel59200 dans le forum MXML
    Réponses: 1
    Dernier message: 10/07/2007, 10h44
  3. Problème décalage du JPanel dans une JFrame a cause du JMenuBar
    Par matou72 dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 09/03/2007, 20h17
  4. Positionner précisement plusieurs JPanel dans une JFrame.
    Par RadicalBob dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 13/06/2006, 22h42
  5. Gestion de menu, JPanels dans une JFrame
    Par Doc.Fusion dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 03/12/2004, 18h27

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