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 :

Changement de panel : Bug?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut Changement de panel : Bug?
    Bonjour,

    je vous présente mon problème. Je fais une interface graphique dans laquelle mes éléments dessinent leur fond. J'ai de plus un menu permettant de changer le contenu du JPanel principal. Pour faciliter, j'avais prévu de créer autant de JPanel qu'il éxiste de pages, et de simplement modifier celui qui devait etre affiché.

    Seulement, à priori, tout devrait fonctionner, mais JAVA en a décidé autrement. Lorsque je clique sur un bouton pour modifier mon panel, le clic est bien pris en compte, le panel change, MAIS ne s'affiche pas... Si, après cette action (panel invisible donc), je réduis/agrandit la fenêtre, le panel s'affiche. Un soucis d'actualisation? Pas de problème! J'ajoute un repaint() à ma méthode... Sauf que le soucis se reproduit toujours... Voici le code pour que vous compreniez mieux mon désarroi. Le problème se situe au niveau de la méthode affiche(int page) de la classe JCorps.

    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 Controleur implements MouseListener{
     
    	private static JInterface inter;
    	private static Personnage perso;
     
    	public Controleur() throws Exception{
    		inter = new JInterface();
    		for ( int i = 0; i < inter.getMenu().getBoutons().size(); i++ )
    			inter.getMenu().getBoutons().get(i).addMouseListener(this);
    	}
     
    	public void mouseClicked(MouseEvent e){
    		for ( int i = 0; i < inter.getMenu().getBoutons().size(); i++ )
    			if ( e.getSource() == inter.getMenu().getBoutons().get(i) )
    				inter.getCorps().affiche(i);
    	}
    }
    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
     
    public class JInterface extends JFrame {
     
    	private JCorps corps;
    	private BorderLayout frameLayout;
     
    	public JInterface(){
    		super("...");
    		init();
    	}
     
    	public void init(){
    		frameLayout = new BorderLayout();
    		corps = new JCorps();
    		setLayout(frameLayout);
    		add(corps, BorderLayout.SOUTH);
    		setLocation(400,250);
    		setSize(new Dimension(800,600));
    		setResizable(false);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setVisible(true);
    	}
     
    	public JMenu getMenu(){
    		return corps.getMenu();
    	}
     
    	public JCorps getCorps(){
    		return corps;
    	}
    }
    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
     
    public class JCorps extends JPanel{
     
    	private JMenu menu;
    	private ArrayList<JContenu> contenu;
    	BorderLayout layout;
     
    	public JCorps () {
    		super();
    		layout = new BorderLayout();
    		setLayout(layout);
    		contenu = new ArrayList<JContenu>();
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		contenu.add(new JContenu());
    		setPreferredSize(new Dimension(800, 440));
    		add(menu = new JMenu(), BorderLayout.EAST);
    		add(contenu.get(0), BorderLayout.WEST);
    	}
     
    	public void paint(Graphics g) {
    		try {
    			BufferedImage image = ImageIO.read(new File("img/corps.jpg"));
    			g.drawImage(image, 0, 0, null);
    			paintChildren(g);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void affiche(int page){
    		removeAll();
    		add(menu, BorderLayout.EAST);
    		add(contenu.get(page), BorderLayout.WEST);
    		repaint();
    	}
     
    	public JMenu getMenu(){
    		return menu;
    	}
    }
    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 JContenu extends JPanel{
     
    	public JContenu() {
    		super();
    		setPreferredSize(new Dimension(600, 440));
    	}
     
    	public void paint(Graphics g) {
    		try {
    			BufferedImage image = ImageIO.read(new File("img/contenu.png"));
    			g.drawImage(image, 0, 0, null);
    			paintChildren(g);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

    Et la je bloque completement... Un problème de synchro? Mais dans ce cas pourquoi le paint est-il bloqué? Je compte sur vos lumière Et merci à tous ceux qui prendront le temps d'étudier mon cas

    Ps : Je suis preneur d'autres solutions si vous me donnez leurs avantages... Par contre j'aimerais vraiment comprendre la nature du soucis ici.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il faut faire un "revalidate" dans ton JPanel pour lui dire qu'il doit recalculer toutes les tailles et positions des composants enfants car ils ont changé.
    Une méthode alternative consisterait à créer une fois pour toute tes JPanel et utiliser un CardLayout pour swapper autant que tu veux d'un JPanel à un autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut
    Merci, ca fonctionne en effet. Par contre je ne comprend pas bien, paint() devrait redessiner les composants enfant avec le paintChildren(), non? Même deux fois, puisque paintChildren() doit également être appelé avant ca... Surtout que, mes composants n'ayant jamais été dessinés, il devrait paraitre logique de calculer leur tailles et positions au premier affichage. (le problème ne se posait que jusqu'au premier affichage de l'élément, si je réduisais/agrandissait ma fenêtre, le fonctionnement était ensuite normal)

    En tout cas, merci beaucoup d'avoir pris le temps de me répondre


    Pour Elendhil : Non j'avais essayé, mais cette méthode doit être appelée par le paintChildren().

    Je vais me renseigner sur le CardLayout Merci à vous deux.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Un copier coller d'une réponse à un message demandant quand utiliser (re)validate ou repaint.

    Si tu changes l'icône d'un JLabel et que le label ne change pas de taille, tu dois simplement appeler repaint().
    (re)validate servent a reconstruire la taille et la position des composants au sein d'un layoutmanager en cas de modification "majeure" (e.g. suppression de composants, ajouts de composants, modification de la taille de composants).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut
    D'accord je te remercie.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Je pense que c'est le fait que tu appels la méthode repaint() sur le panel JCorps et non sur le panel JContenu . Test pour voir si c'est bien ça ?

    Sinon il y a un Layout par défaut qui permet de réaliser ce que tu fais c'est le CardLayout :
    Ya un tuto ici(http://java.sun.com/docs/books/tutor...yout/card.html)
    qui explique comment l'utiliser.

    Après si sur tes JPanels tu ne fais que du pur dessin , il vaut mieux utiliser un seul panel , effacer et redessiner avec java2D par exemple si tu comptes dessiner sur tes images.

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

Discussions similaires

  1. probleme de changement des panel au sein d'une fenetre
    Par switch1 dans le forum Composants
    Réponses: 2
    Dernier message: 04/03/2009, 13h17
  2. [C#] problème scintillement lors du changement de panel
    Par chasse dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/10/2006, 15h00
  3. Changement de Panel
    Par arsenik7 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 19/01/2006, 09h15
  4. [AWT]Changement de panel dans un panel
    Par guipom dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 27/12/2004, 15h57
  5. [JScrollPane] Changement du panel
    Par -=Spoon=- dans le forum Composants
    Réponses: 5
    Dernier message: 09/12/2004, 23h35

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