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

Agents de placement/Fenêtres Java Discussion :

[JFrame] réafficher plusieurs fois un même panel à l'écran


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 66
    Points : 80
    Points
    80
    Par défaut [JFrame] réafficher plusieurs fois un même panel à l'écran
    Bonjour,
    J'ai une jframe qui contient dans son centre un panel et en dessous un bouton. Quand j'appuye sur le bouton du dessous le panel suivant est affiché.
    Petit schéma pour que ce soir clair :

    Donc en appuyant plusieurs fois sur next, le centre du borderLayout va contenir le panel0 puis le panel1, panel2, de nouveau le panel0, panel1, ...

    Le problème est que lorsqu'un panel apparait pour la première fois il est bien affiché mais lorsque je le réaffiche une seconde fois rien ne se passe, on vois toujours le panel qui était là avant.

    J'ai vu ceci dans la javadoc pour la méthode add de Container :
    Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.
    et j'ai bien ajouté la méthode validate() mais ca ne fonctionne pas.


    Voici le code complet :
    (le changement de panel se fait dans la méthode actionPerformed, qui se trouve au milieu du code)
    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
    69
    70
    71
    72
    /*
     * créé le Apr 1, 2005 par Monkeyget
     */
    package gui;
     
    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 TestMultiplePanel extends JFrame implements ActionListener{
        private JPanel[] panels;
        private int currentPanel;
     
        public static void main(String[] args) {
            new TestMultiplePanel();
        }
     
        public TestMultiplePanel(){
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(640, 480);
     
            // tableau contenant 3 Jpanel
            panels = new JPanel[]{new Panel0(), new Panel1(), new Panel2()};
            currentPanel = 0;
            this.getContentPane().add(panels[currentPanel], BorderLayout.CENTER);
     
            //bouton pour changer de panel
            JButton next = new JButton("Next panel");
            next.addActionListener(this);
            this.getContentPane().add(next, BorderLayout.SOUTH);
     
            this.setVisible(true);
        }
     
        //action pour le bouton next. On affiche le panel suivant du tableau de JPanel
        public void actionPerformed(ActionEvent arg0) {
            currentPanel = (currentPanel+1)%panels.length;
            System.out.println(currentPanel);
            this.getContentPane().add(panels[currentPanel]);
            this.validate();
            this.setVisible(true);
        }
    }
     
     
    class Panel0 extends JPanel{
        public Panel0(){
           this.add(new JLabel("Panel 0"));
           this.setBackground(Color.BLACK);
        }
    }
     
    class Panel1 extends JPanel{
        public Panel1(){
           this.add(new JLabel("Panel 1"));
           this.setBackground(Color.YELLOW);
        }
    }
     
    class Panel2 extends JPanel{
        public Panel2(){
           this.add(new JLabel("Panel 2"));
           this.setBackground(Color.RED);
        }
    }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 133
    Points : 112
    Points
    112
    Par défaut
    tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monPanel.setVisible(false);
    monPanel.removeAll();
    monPanel.add(panel1);
    monPanel.setVisible(true);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 73
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Il faut que tu rende visible seulement le JPanel en cours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	//action pour le bouton next. On affiche le panel suivant du tableau de JPanel
    	public void actionPerformed(ActionEvent arg0) {
    		currentPanel = (currentPanel + 1) % panels.length;
    		System.out.println(currentPanel);
    		this.getContentPane().add(panels[currentPanel]);
    		this.validate();
    		this.setVisible(true);
     
    		//------------------------- Lignes rajoutées ----------------------
    		for(int i=0;i<panels.length;i++){
    			panels[i].setVisible(i==currentPanel);
    		}
    		//-----------------------------------------------------------------
    	}
    A partir de là, çà ne sert pas à grand chose, d'ajouter les JPanel à chaque
    clics (si leur nombre est défini, j'entends)...
    Tu peux les rajouter tous à la fois au moment de l'initialisation et ne rendre visible que le premier...
    Mais il faut je pense utiliser un autre layout, je te conseille GridBagLayout :
    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
    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    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 TestMultiplePanel extends JFrame implements ActionListener {
    	private JPanel[] panels;
    	private int currentPanel;
     
    	public static void main(String[] args) {
    		new TestMultiplePanel();
    	}
     
    	public TestMultiplePanel() {
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setSize(640, 480);
     
    		//Layout 
    		this.getContentPane().setLayout(new GridBagLayout());
    		//Contrainte du layout
    		GridBagConstraints contrainte=new GridBagConstraints();
    		//Contraintes de remplissage
    		contrainte.fill=GridBagConstraints.BOTH;
    		contrainte.weightx=1;	// "Poids" du remplissage
    		contrainte.weighty=1000;
     
    		// tableau contenant 3 Jpanel
    		panels = new JPanel[] { new Panel0("Panel 0",Color.BLACK), 
    								new Panel0("Panel 1",Color.YELLOW), 
    								new Panel0("Panel 2",Color.RED)};
    		currentPanel = 0;
    		for(int i=0;i<panels.length;i++){
    			this.getContentPane().add(panels[i],contrainte);
    		}
     
    		contrainte.gridy=1;	// Décale le positionnement vertical de la contrainte
    		contrainte.weighty=1;		// Fixe un poids 1000 fois plus petit qu'avant
    		contrainte.fill=GridBagConstraints.HORIZONTAL;
     
    		//bouton pour changer de panel
    		JButton next = new JButton("Next panel");
    		next.addActionListener(this);
    		this.getContentPane().add(next,contrainte);
     
    		rendVisibleCourant();
    		this.setVisible(true);
    	}
     
    	private void rendVisibleCourant(){
    		for(int i=0;i<panels.length;i++){
    			panels[i].setVisible(i==currentPanel);
    		}
    	}
     
    	//action pour le bouton next. On affiche le panel suivant du tableau de JPanel
    	public void actionPerformed(ActionEvent arg0) {
    		currentPanel = (currentPanel + 1) % panels.length;
    		System.out.println(currentPanel);
    		rendVisibleCourant();
    	}
    }
    Cordialement,

    Remarque : très astucieux le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentPanel = (currentPanel + 1) % panels.length;
    Je ne connaissais pas : j'apprends.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 66
    Points : 80
    Points
    80
    Par défaut
    Je n'aurais jamais pensé à mettre tous les panels en même temps et n'afficher que celui qu'il faut. Je tâcherais de me souvenir de ce truc :] .
    Je vois que tu a changé tout le code pour qu'il soit plus beau et fonctionnel, tu as du passer du temps dessus alors je me sens gêné d'utiliser la solution de nicoo .

    Pour info voila comment je fait pour changer le panel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    this.getContentPane().setVisible(false);
    this.getContentPane().remove(panels[currentPanel]);
     
    //sélectionne le panel suivant
    currentPanel = (currentPanel+1)%panels.length;
     
    this.getContentPane().add(panels[currentPanel]);
    this.getContentPane().setVisible(true);
    j'utilise remove() au lieu de removeAll();

    Merci bidon et nicoo!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 73
    Points : 78
    Points
    78
    Par défaut
    Y a pas de soucis...
    L'important c'est que tu es ta soluce

    D'ailleurs, je vient de me rendre compte que j'avais fait une modif que j'ai oublié dans mon copier-coller, çà va à la fin du listing...

    Pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Panel0 extends JPanel {
    	public Panel0(String label,Color couleur) {
    		this.add(new JLabel(label));
    		this.setBackground(couleur);
    	}
    }
    C'est pour éviter d'avoir plusieurs classe..

    Cordialement,

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

Discussions similaires

  1. Ouvrir plusieurs fois le même formulaire
    Par Kloun dans le forum Access
    Réponses: 9
    Dernier message: 21/03/2006, 20h47
  2. Réponses: 23
    Dernier message: 08/02/2006, 09h15
  3. [VBA-W] Executer plusieurs fois la même procédure
    Par delamarque dans le forum VBA Word
    Réponses: 3
    Dernier message: 05/12/2005, 13h39
  4. SELECT plusieurs fois les mêmes champs
    Par aergil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/02/2005, 12h10
  5. [VB.NET] Appliquer plusieurs fois la même fonction...
    Par MiJack dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/09/2004, 10h52

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