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 :

un objet JPanel qui ne s'affiche pas


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 195
    Par défaut un objet JPanel qui ne s'affiche pas
    Salut tout le monde, je rencontre un problème lors de l'affichage d'un objet JPanel (ici c'est l'objet panel qui est une instance de la classe Panneau), je vais copier-coller le code source, j'espère que vous arriviez à identifier le problème:

    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
     
    public class Fenetre extends JFrame 
    {
    	Panneau panel=new Panneau();
    	JPanel ardoise=new JPanel();
    	JPanel container=new JPanel();
     
    	public Fenetre()
    	{	
    		this.setTitle("Fenetre");
    		this.setSize(400,400);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		container.setLayout(new BorderLayout());
     
    		ardoise.setLocation(0,0);
    		ardoise.setPreferredSize(new Dimension(400,400));
    		ardoise.setBackground(Color.WHITE);
    		ardoise.add(panel);
     
    		container.add(ardoise,BorderLayout.CENTER);
    		this.setContentPane(container);
    		this.setVisible(true);
    	}
    }
    et en ce qui concerne le code de la classe qui hérite du JPanel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Panneau extends JPanel 
    {
    	public void paintComponent(Graphics g)
    	{
     
    		g.setColor(Color.RED);
    		g.drawString("essai",50, 50);
    		g.drawRect(50, 50, 60, 20);
    	}
    }
    Dans la classe Fenetre, quand je remplace: this.setContentPane(container) par this.setContentPane(panel) je vois mon objet panel dessiné à l'écran mais dans ce petit programme d'essai j'ai besoin que ça marche avec le panel qui est contenu dans un autre objet JPanel (genre ardoise) qui est contenu à son tour dans le container.

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Ajoute un layout à ardoise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ardoise.setLayout(new BorderLayout());

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 195
    Par défaut
    ça marche très bien! merci pour l'aide

  4. #4
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Bonsoir !

    Citation Envoyé par visiwi
    Salut,

    Ajoute un layout à ardoise.

    Code :

    ardoise.setLayout(new BorderLayout());
    Peux-tu nous en dire plus, s'il te plait ? Tu indiques : "Ajout un layout à ardoise", mais ... pas n'importe quel layout ! BorderLayout fonctionne, de même que GridLayout... Par contre, avec FlowLayout, ça ne marche pas...

    Peux-tu nous expliquer la différence entre FlowLayout et les autres layout qui fait que ça marche ou pas ... (heu ... je connais la différence entre ces layout au niveau de l'affichage, hein! )

    Merci !

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    parce que le panneau est mal concu donc le flowlayout se sait pas le positionner en utilisant getMinimumSize() , getMaximumSize() et getPreferredSize() (ces trois méthodes renvoient 0 pour le panneau -> flowlayoput met le panneau à taille 0. Le boderlayout, lui, il ignore superbement ces valeur et positionne Panneau sans lui demander son avis -> ça marche

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    En clair il faut calculer la preferredSize afin que les layout puissent jouer leurs rôles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	@Override
    	public Dimension getPreferredSize() {
    		// Si la taille a été modifié par un setPreferredSize() : 
    		if (isPreferredSizeSet()) {
    			// On retourne cette taille :
    			return super.getPreferredSize();
    		}
    		// Sinon on la calcule (ici je met des valeurs en dur) :
    		return new Dimension(100, 100);
    	}
    Attention car il faudrait en plus prendre en compte les éventuels marges et bordure, que ce soit lors du calcul de la preferredSize que lors du dessin...


    Sans compter qu'ici on a affaire à un JPanel, qui devrait donc contenir d'autres composants et donc sa taille devrait être calculé selon ces derniers...



    Il serait nettement plus propre de créer sa propre UI !


    a++

  7. #7
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Merci beaucoup pour vos réponses ... Je crois que ça m'aide un peu à comprendre ... Mais ...

    Que pensez-vous de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Panneau extends JPanel{
        public Panneau(){
            super();
            setPreferredSize(new Dimension(100,100)); // Ou autre dim !
        }
        public void paintComponent(Graphics g){ // ...
        }
    }
    Ca marche, en tous cas

    Qu'en pensez-vous ? ? ?

    D'avance, merci

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

Discussions similaires

  1. [JPanel] Image qui ne s'affiche pas
    Par poussinvert dans le forum Débuter
    Réponses: 6
    Dernier message: 21/04/2013, 23h36
  2. Un objet qui ne s'affiche pas
    Par tonytrua dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 15/12/2011, 15h18
  3. Un objet JPanel qui ne s'affiche pas.
    Par poppels dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 09/03/2009, 10h54
  4. [debutant][Tomcat]Images qui ne s'affichent pas
    Par omega dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 07/04/2004, 10h44
  5. [MFC] Ces fenêtres qui ne s'affichent pas..
    Par Davide dans le forum MFC
    Réponses: 3
    Dernier message: 19/11/2003, 12h30

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