Afficher JPanel après RemoveAll de la JFrame

Afficher JPanel après RemoveAll de la JFrame - Java - Programmation

Marsh Posté le 26-09-2009 à 16:39:00    

Bonjour à tous,
Voici le problème sur lequel je bute:
1- Affichage d'une JPanel j1 (avec un bouton b1 -> sans importance) dans une Jframe;
2- Lorsque l'utilisateur appuie sur le bouton, tout est remové du JFrame et la variabe entière num1 passe à 3. La fonction JBinit est relancée.
3- Ensuite, une autre Jpanel j2 est censé s'afficher dans la JFrame.
 
Seulement, j2 ne s'affiche pas.
 
Voici mon code:

Code :
  1. package language;
  2. import java.awt.Container;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import javax.swing.JPanel;
  8. public class toto extends JFrame implements ActionListener
  9. {
  10.     JButton voc, verbe;   
  11.     Container c;
  12.     Rectangle rec;   
  13.     JPanel j1,j2;
  14.     JButton b1,b2;
  15.     int num1=2;
  16.     public toto()
  17.     {
  18.         b1 = new JButton("ok" );
  19.         b2 = new JButton("souk" );
  20.         j1 = new JPanel();       
  21.         j2 = new JPanel();
  22.         Jbinit();
  23.     }
  24.     public void Jbinit()
  25.     {
  26.         j1.add(b1);
  27.         j2.add(b2);
  28.         c = getContentPane();       
  29.         setLayout(null);
  30.         verbe = new JButton("bouton1" );
  31.         verbe.setBounds(150, 0, 150, 30);
  32.         verbe.addActionListener(this);
  33.         voc = new JButton("bouton2" );
  34.         voc.setBounds(300, 0, 150, 30);
  35.         voc.addActionListener(this);
  36.         c.add(voc);       
  37.         c.add(verbe);
  38.         System.out.println("num:" + num1);
  39.         if (num1 == 2)
  40.         {
  41.             j1.setBounds(0, 85, 600, 40);
  42.             c.add(j1);
  43.         }
  44.         if (num1 == 3)
  45.         {
  46.             j1.setBounds(0, 60, 600, 480);
  47.             c.add(j2);
  48.         }
  49.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  50.     }
  51.     public void actionPerformed(ActionEvent e) {
  52.         Object source = e.getSource();
  53.         if (source == voc)
  54.         {
  55.             num1 = 3;
  56.             c.removeAll();
  57.             this.Jbinit();
  58.             this.repaint();
  59.         }
  60.     } 
  61.     public static void main(String[] args) {
  62.         JFrame page = new toto();
  63.         page.setBounds(400, 60, 600, 650);
  64.         page.setResizable(false);
  65.         page.setVisible(true);
  66.     }
  67. }


 
Merci d'avance pour votre aide!!

Reply

Marsh Posté le 26-09-2009 à 16:39:00   

Reply

Marsh Posté le 26-09-2009 à 19:59:18    

Le seul truc que j'ai trouvé (horrible!!!) mais qui marche, c'est remplir le conteneur avec tout ce dont j'ai besoin et puis, jouer sur les show/hide sur les objets que je veux faire apparaître.
 
Sur le prototype de code que j'ai fait, cela ressemble à ça:
 

Code :
  1. package language;
  2. import java.awt.Container;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import javax.swing.JPanel;
  8. public class toto extends JFrame implements ActionListener
  9. {
  10.     JButton voc, verbe;   
  11.     Container c;
  12.     Rectangle rec;   
  13.     JPanel j1,j2;
  14.     JButton b1,b2;
  15.     int num1=2;
  16.     public toto()
  17.     {
  18.         c = getContentPane();       
  19.         setLayout(null);
  20.         b1 = new JButton("ok" );
  21.         b2 = new JButton("souk" );
  22.         j1 = new JPanel();     
  23.         j1.setBounds(0, 85, 600, 40);         
  24.         j2 = new JPanel();
  25.         j2.setBounds(0, 60, 600, 480);
  26.         verbe = new JButton("bouton1" );
  27.         verbe.setBounds(150, 0, 150, 30);
  28.         verbe.addActionListener(this);
  29.         voc = new JButton("bouton2" );
  30.         voc.setBounds(300, 0, 150, 30);
  31.         voc.addActionListener(this);
  32.         j1.add(b1);
  33.         j2.add(b2);
  34.         c.add(voc);       
  35.         c.add(verbe);
  36.         Jbinit();
  37.     }
  38.     public void Jbinit()
  39.     {
  40.         j1.hide();
  41.         j2.hide();
  42.        
  43.         if (num1 == 2)
  44.         {           
  45.             j1.show();
  46.         }
  47.         if (num1 == 3)
  48.         {
  49.            
  50.             j2.show();
  51.         }
  52.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  53.     }
  54.     public void actionPerformed(ActionEvent e) {
  55.         Object source = e.getSource();
  56.         if (source == voc)
  57.         {
  58.             num1 = 3;           
  59.             this.Jbinit();
  60.             this.repaint();
  61.         }
  62.     } 
  63.     public static void main(String[] args) {
  64.         JFrame page = new toto();
  65.         page.setBounds(400, 60, 600, 650);
  66.         page.setResizable(false);
  67.         page.setVisible(true);
  68.     }
  69. }


 
Si quelqu'un a malgré tout une idée sur la manière de procéder...
:D

Reply

Marsh Posté le 28-09-2009 à 01:07:58    

Salut,
 
Quand tu modifies les composants d'une fenêtre en cours d'affichage, tu dois appeler la méthode validate() sur le conteneur pour qu'il redessine correctement tous les composants. C'est même marqué noir sur blanc dans la documentation de add().
 
Après nettoyage de ton code, j'obtiens ceci:
 

Code :
  1. package fr.language;
  2.  
  3. import java.awt.Container;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JPanel;
  9.  
  10. public class Toto extends JFrame implements ActionListener {
  11.  
  12.     private static final long serialVersionUID = 1L;
  13.     
  14.     private JButton voc, verbe;
  15.     private JPanel j1, j2;
  16.     private JButton b1, b2;
  17.     private int num1 = 2;
  18.  
  19.     public Toto() {
  20.         setBounds(400, 60, 600, 650);
  21.         setResizable(false);
  22.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  23.         setLayout(null);    // A éviter!
  24.         
  25.         verbe = new JButton("bouton1" );
  26.         verbe.setBounds(150, 0, 150, 30);
  27.         verbe.addActionListener(this);
  28.         
  29.         voc = new JButton("bouton2" );
  30.         voc.setBounds(300, 0, 150, 30);
  31.         voc.addActionListener(this);
  32.         
  33.         j1 = new JPanel();
  34.         j1.setBounds(0, 85, 600, 40);
  35.         b1 = new JButton("ok" );
  36.         j1.add(b1);
  37.         
  38.         j2 = new JPanel();
  39.         j2.setBounds(0, 60, 600, 480);
  40.         b2 = new JButton("souk" );
  41.         j2.add(b2);
  42.         
  43.         jbInit();
  44.     }
  45.     
  46.     public void jbInit() {
  47.         System.out.println("num:" + num1);
  48.         
  49.         Container content = getContentPane();
  50.         content.removeAll();
  51.         content.add(voc);
  52.         content.add(verbe);
  53.         switch (num1) {
  54.         case 2:
  55.             content.add(j1);
  56.             break;
  57.         case 3:
  58.             content.add(j2);
  59.         }
  60.     }
  61.     
  62.     public void actionPerformed (ActionEvent e) {
  63.         if (e.getSource() == voc) {
  64.             num1 = 3;
  65.             jbInit();
  66.             // Réarrange les composants actuellement affichés
  67.             getContentPane().validate();
  68.             repaint();
  69.         }
  70.     }
  71.     
  72.     public static void main(String[] args) {
  73.         new Toto().setVisible(true);
  74.     }
  75. }


 
Note également qu'il est fortement déconseillé de ne pas utiliser de LayoutManager (le mettre à null comme tu fais). Ici tu devrais utiliser un BoxLayout vertical par exemple, ou encore un BorderLayout, et mettre les 2 boutons du haut dans un autre JPanel afin qu'ils s'affichent toujours côte à côte.

Reply

Marsh Posté le 28-09-2009 à 21:37:22    

Je te remercie pour ta réponse! Je vais tester tout ça! Je voulais tester aussi le mode design proposé par netbeans. Par contre, pour tester, y-a-il un moyen de copier-coller ton code sans avoir les numéros de lignes. J'ai essayé avec la sélection intelligent de firefox mais je ne sais pour quelles raisons, il est grisé!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed