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

Composants Java Discussion :

Problème affichage Jscrollpane


Sujet :

Composants Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème affichage Jscrollpane
    Bonjour, j'ai actuellement un projet avec mon école, et pour la fenetre de crédits de notre jeu, nous aimerions pouvoir mettre une scrollbar.

    Mais elle ne s'affiche pas car apparemment "I'm adding a component's parent to itself". Sauf que je ne vois pas l'erreur du tout, et j'ai regardé sur quelques tutos pour voir comment il fallait faire, mais rien ne m'a vraiment aidé. Je vous écris tout le code de la classe: (panneaufond étant uen classe héritée de JPanel)

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.*;
     
     
    ///nos packages
    import panneaux.*;
    import Photos.*;
     
     
    public class FenetreCredit extends JFrame {
            private GridBagLayout gridBag =new GridBagLayout();
            private JButton retour;
            private JLabel TexteHadrien;
            private JLabel TexteNoemie;
            private JLabel TexteEtienne;
            private JLabel TexteMaxime;
            private PanneauFond p = new PanneauFond();
            private JScrollPane scroll;
     
        public FenetreCredit (){
            super("FenetreCredit");
        ///Différent Panneaux et Frame Utiles:
            AffichePhotoNoemie Nono= new AffichePhotoNoemie();
            AffichePhotoEtienne Titi = new AffichePhotoEtienne();
            AffichePhotoMaxime Max= new AffichePhotoMaxime();
            AffichePhotoHadrien Hadri=new AffichePhotoHadrien();
     
            p.setLayout(new GridBagLayout());
            setLayout(gridBag);
        ///Déclaration et Spécificité des GridBagLayout
            GridBagConstraints Texte = new GridBagConstraints();
            GridBagConstraints Noemie = new GridBagConstraints();
            GridBagConstraints Etienne = new GridBagConstraints();
            GridBagConstraints Maxime =new GridBagConstraints();
            GridBagConstraints Hadrien = new GridBagConstraints();
            GridBagConstraints TxtNoemie = new GridBagConstraints();
            GridBagConstraints TxtEtienne = new GridBagConstraints();
            GridBagConstraints TxtMaxime =new GridBagConstraints();
            GridBagConstraints TxtHadrien = new GridBagConstraints();
            GridBagConstraints retour = new GridBagConstraints();
            GridBagConstraints Scroll = new GridBagConstraints();
     
     
            Texte.gridx=1;
            Noemie.gridx=0;
            Etienne.gridx=0;
            Maxime.gridx=0;
            Hadrien.gridx=0;
            TxtNoemie.gridx=1;
            TxtEtienne.gridx=1;
            TxtMaxime.gridx=1;
            TxtHadrien.gridx=1;
            retour.gridx=1;
     
     
            Noemie.ipadx=100;//Dimensionnement des "cases" accueillant les photos, le gridBagLayout divisant la fenetre en cases:
            Noemie.ipady=150;
            Etienne.ipadx=100;
            Etienne.ipady=150;
            Maxime.ipadx=100;
            Maxime.ipady=150;
            Hadrien.ipadx=100;
            Hadrien.ipady=150;
            TxtHadrien.ipadx=250;
            TxtNoemie.ipadx=250;
            TxtEtienne.ipadx=250;
            TxtMaxime.ipadx=250;
            Texte.ipadx=250;
     
            Texte.insets=new Insets (10,50,10,0);
            Noemie.insets=new Insets (10,0,10,0);
            Etienne.insets=new Insets (10,0,10,0);
            Maxime.insets=new Insets (10,0,10,0);
            Hadrien.insets=new Insets (10,0,10,0);
            retour.insets=new Insets (10,0,10,0);
     
     
        //Création des éléments de la fenetre
            JLabel txt = new JLabel ("<html>Le Tangram est un jeu solitaire, plus précisément un casse-tête chinois.<br>Le but de ce puzzle est de juxtaposer différentes pièces afin de reproduire une forme donnée comme: <br> une forme d'animal, un personnage, ou tout simplement une forme artistique.<br>Historiquement, la légende dit qu'un empereur chinois du XVIe siècle du nom de «Tan», fit tomber un carreau de faïence qui se brisa en 7 morceaux.<br> Il n'arriva jamais à  rassembler les morceaux pour reconstituer le carreau<br> mais l'homme s'aperçut qu'avec les 7 pièces,<br> il était possible de créer quantités de formes multiples, d'où l origine du jeu de Tangram.<br>L'application présentée ici a pour but de vous divertir et de développer votre créativité et votre logique.<br>Bon jeu!");
     
     
            JLabel TexteHadrien=new JLabel("<html>Si notre application est aussi stylée, c'est grâce à Hadrien, le designer de l'application.<br> Il a créé toutes les fenêtres du jeu Tangram.<br> Il est également à l'origine de la gestion des scores."); 
            JLabel TexteNoemie= new JLabel("<html>Noémie est la chef de projet.<br> Elle coordonne le groupe pour, par exemple, terminer le projet dans les temps.<br> Elle est également la développeuse de ce site. Même si le langage Java n'est pas son point fort,<br> elle a tout de même codé quelques lignes de l'application: <br>les indices et l'enregistrement des scores ont été codé par elle.");
            JLabel TexteEtienne= new JLabel("<html>Si vous pouvez déplacer et faire tourner les formes, c'est grâce à Etienne!<br> Avec Maxime, il a créé les sept formes qui permettent de réaliser les figures du Tangram.<br> Il a également codé les méthodes qui permettent de déplacer, tourner les pièces... <br>Si vous avez la chance de pouvoir jouer en mode chrono, c'est aussi grâce à lui.");
            JLabel TexteMaxime= new JLabel("<html>Maxime c'est le pro de la base de données.<br> C'est grâce à lui que l'application propose des figures aussi variées.<br> Il a aussi travaillé avec Etienne pour la cration des sept formes de base,<br> et pour le mode chronomètre.");
            JButton Retour = new JButton ("Retour");
     
     
        //Listener pour le bouton Reprendre
     
            Retour.addActionListener(new ActionListener(){
                public void actionPerformed (ActionEvent e){
                    //new Son("sons/EXPLOSION.WAV");            
                    new FenetreMenu();
                    dispose();    //Pour fermer la fenetre avant de passer à la suivante
                }
            });
     
        //Ajout au panel:
            setContentPane(Nono); //Ajout de la photo de Noemie au panneau AfficheNoemie
            setContentPane(Titi);
            setContentPane(Max);
            setContentPane(Hadri);
            //p.add(txt,Texte);
            p.add(Nono,Noemie);
            p.add(TexteNoemie, TxtNoemie);
            p.add(TexteEtienne, TxtEtienne);
            p.add(TexteMaxime, TxtMaxime);
            p.add(Titi,Etienne);
            p.add(TexteHadrien, TxtHadrien);
            p.add(Max,Maxime);
            p.add(Hadri,Hadrien);
            p.add(Retour, retour);
     
            scroll = new JScrollPane(p);
            getContentPane().add(scroll,Scroll);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(1200,700);
            setContentPane(p);
            setResizable(false);
            setVisible (true);
     
     
     
        }
        public static void main(String[] a) {
            new FenetreCredit();
        }
     
     
    }
    Si par hasard vous aviez une idée de que ce nous devrions faire, je vous en serais très reconnaissant !

  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,

    Le "content pane" d'une JFrame, c'est l'endroit où se trouve son contenu. Donc quand tu appelles setContentPane( machin ), tu dis le contenu de ma fenêtre sera le "panneau" machin. Une fenêtre ne peut avoir qu'un seul "content pane". Donc, à chaque fois que tu appelles setContentPane( ), tu remplaces le panneau précédent par un nouveau.

    Dans ton code, quand tu appelles getContentPane().add(scroll,Scroll);, ça dit "ajoute au content pane actuel le composant scroll, avec la contrainte Scroll)[/c]. Le dernier appel à setContentPane(), précédant cet appel, est setContentPane(Hadri);. Donc le content pane est Hadri. Or, tu as fait, un peu avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* ... */
    p.add(Hadri,Hadrien);
    /* ... */
    scroll = new JScrollPane(p);
    Donc Hadri est dans p, qui est dans Scroll. Donc tu essayes de mettre un composant qui contient Hadri dans Hadri (le content pane actuel), ce que Swing refuse en te soulevant l'exception que tu obtiens.

    Laisse le content pane tel qu'il est : il est très bien comme ça. Donc enlève juste tous les setContentPane() de ton code. Ajoute juste scroll au content pane, sans contraintes Scroll (donc fait juste getContentPane().add(scroll); (ou add(scroll,Scroll);, qui fait exactement la même chose (c'est une facilité offerte par JFrame)). Le content pane par défaut d'une JFrame a un BorderLayout comme layout manager. Le fait d'ajouter scroll à ce panel sans contrainte signifie que ça utilisera la contrainte BorderLayout.CENTER par défaut, donc le composant scroll va s'étendre sur tout l'espace de la fenêtre.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Salut !

    Déjà merci de ta réponse très rapide
    Du coup j'ai supprimé tous les setContentPane du code, ainsi que le GridLayout Scroll. Mais après avoir lancé le programme rien se s'affichait sur la fenêtre à part un carré gris au milieu assez petit. Je me sui alors dit que j'avais mal compris et j'ai laissé le setContentPane(p), et sur la ligne suivante je fait mon "getContentPane().add(scroll);".
    Maintenant la fenêtre s'affiche bien, mais il n'y a toujours pas de Jscrollbar; et il y a en plus un petit carré gris (qui représente peut-être le scroll) qui est apparu à côté de txtNoemie.
    Je réecris tout le code pour être clair, et merci encore de la réponse

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    package fenetres;
     
    ///package java
    import javax.swing.*;
     
    import java.awt.*;
    import java.awt.event.*;
     
    ///nos packages
    import panneaux.*;
    import Photos.*;
     
    public class FenetreCredit extends JFrame {
    		private GridBagLayout gridBag =new GridBagLayout();
    		private JButton retour;
    		private JLabel TexteHadrien;
    		private JLabel TexteNoemie;
    		private JLabel TexteEtienne;
    		private JLabel TexteMaxime;
    		private PanneauFond p = new PanneauFond();
    		private JScrollPane scroll;
     
    	public FenetreCredit (){
    		super("FenetreCredit");
    	///Différent Panneaux et Frame Utiles:
    		AffichePhotoNoemie Nono= new AffichePhotoNoemie();
    		AffichePhotoEtienne Titi = new AffichePhotoEtienne();
    		AffichePhotoMaxime Max= new AffichePhotoMaxime();
    		AffichePhotoHadrien Hadri=new AffichePhotoHadrien();
     
    		p.setLayout(new GridBagLayout());
    		setLayout(gridBag);
    	///Déclaration et Spécificité des GridBagLayout
    		GridBagConstraints Texte = new GridBagConstraints();
    		GridBagConstraints Noemie = new GridBagConstraints();
    		GridBagConstraints Etienne = new GridBagConstraints();
    		GridBagConstraints Maxime =new GridBagConstraints();
    		GridBagConstraints Hadrien = new GridBagConstraints();
    		GridBagConstraints TxtNoemie = new GridBagConstraints();
    		GridBagConstraints TxtEtienne = new GridBagConstraints();
    		GridBagConstraints TxtMaxime =new GridBagConstraints();
    		GridBagConstraints TxtHadrien = new GridBagConstraints();
    		GridBagConstraints retour = new GridBagConstraints();
     
     
     
    		Texte.gridx=1;
    		Noemie.gridx=0;
    		Etienne.gridx=0;
    		Maxime.gridx=0;
    		Hadrien.gridx=0;
    		TxtNoemie.gridx=1;
    		TxtEtienne.gridx=1;
    		TxtMaxime.gridx=1;
    		TxtHadrien.gridx=1;
    		retour.gridx=1;
     
     
    		Noemie.ipadx=100;//Dimensionnement des "cases" accueillant les photos, le gridBagLayout divisant la fenetre en cases:
    		Noemie.ipady=150;
    		Etienne.ipadx=100;
    		Etienne.ipady=150;
    		Maxime.ipadx=100;
    		Maxime.ipady=150;
    		Hadrien.ipadx=100;
    		Hadrien.ipady=150;
    		TxtHadrien.ipadx=250;
    		TxtNoemie.ipadx=250;
    		TxtEtienne.ipadx=250;
    		TxtMaxime.ipadx=250;
    		Texte.ipadx=250;
     
    		Texte.insets=new Insets (10,50,10,0);
    		Noemie.insets=new Insets (10,0,10,0);
    		Etienne.insets=new Insets (10,0,10,0);
    		Maxime.insets=new Insets (10,0,10,0);
    		Hadrien.insets=new Insets (10,0,10,0);
    		retour.insets=new Insets (10,0,10,0);
     
    	//Création des éléments de la fenetre
    		JLabel txt = new JLabel ("<html>Le Tangram est un jeu solitaire, plus précisément un casse-tête chinois.<br>Le but de ce puzzle est de juxtaposer différentes pièces afin de reproduire une forme donnée comme: <br> une forme d'animal, un personnage, ou tout simplement une forme artistique.<br>Historiquement, la légende dit qu'un empereur chinois du XVIe siècle du nom de «Tan», fit tomber un carreau de faïence qui se brisa en 7 morceaux.<br> Il n'arriva jamais à* rassembler les morceaux pour reconstituer le carreau<br> mais l'homme s'aperçut qu'avec les 7 pièces,<br> il était possible de créer quantités de formes multiples, d'où l origine du jeu de Tangram.<br>L'application présentée ici a pour but de vous divertir et de développer votre créativité et votre logique.<br>Bon jeu!");
     
     
    		JLabel TexteHadrien=new JLabel("<html>Si notre application est aussi stylée, c'est grâce à Hadrien, le designer de l'application.<br> Il a créé toutes les fenêtres du jeu Tangram.<br> Il est également à l'origine de la gestion des scores."); 
    		JLabel TexteNoemie= new JLabel("<html>Noémie est la chef de projet.<br> Elle coordonne le groupe pour, par exemple, terminer le projet dans les temps.<br> Elle est également la développeuse de ce site. Même si le langage Java n'est pas son point fort,<br> elle a tout de même codé quelques lignes de l'application: <br>les indices et l'enregistrement des scores ont été codé par elle.");
    		JLabel TexteEtienne= new JLabel("<html>Si vous pouvez déplacer et faire tourner les formes, c'est grâce à Etienne!<br> Avec Maxime, il a créé les sept formes qui permettent de réaliser les figures du Tangram.<br> Il a également codé les méthodes qui permettent de déplacer, tourner les pièces... <br>Si vous avez la chance de pouvoir jouer en mode chrono, c'est aussi grâce à lui.");
    		JLabel TexteMaxime= new JLabel("<html>Maxime c'est le pro de la base de données.<br> C'est grâce à lui que l'application propose des figures aussi variées.<br> Il a aussi travaillé avec Etienne pour la cration des sept formes de base,<br> et pour le mode chronomètre.");
    		JButton Retour = new JButton ("Retour");
     
     
    	//Listener pour le bouton Reprendre
     
    		Retour.addActionListener(new ActionListener(){
    			public void actionPerformed (ActionEvent e){
    				//new Son("sons/EXPLOSION.WAV");			
    				new FenetreMenu();
    				dispose();	//Pour fermer la fenetre avant de passer Ã* la suivante
    			}
    		});
     
    	//Ajout au panel:
    		//p.add(txt,Texte);
    		p.add(Nono,Noemie);
    		p.add(TexteNoemie, TxtNoemie);
    		p.add(TexteEtienne, TxtEtienne);
    		p.add(TexteMaxime, TxtMaxime);
    		p.add(Titi,Etienne);
    		p.add(TexteHadrien, TxtHadrien);
    		p.add(Max,Maxime);
    		p.add(Hadri,Hadrien);
    		p.add(Retour, retour);
     
    		scroll = new JScrollPane(p);
    		setContentPane(p);
    		getContentPane().add(scroll);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(1200,700);
    		setResizable(false);
    		setVisible (true);
     
     
    	}
    	public static void main(String[] a) {
    		new FenetreCredit();
    	}
     
     
    }

  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
    Tout d'abord, je n'avais pas vu setLayout(gridBag); : ça change le layout par défaut du content pane par défaut (un BorderLayout), en GridBagLayout. Enlève cette ligne et laisse le BorderLayout. On laisse le content pane comme il est et on ne travaille que sur p (et son contenu).

    Ensuite, un GridBagLayout définit une grille : chaque case a des coordonnées x et y. Dans ton code, tu n'indiques que x. Donc tous les élements se superposeront dans les mêmes lignes, et même certains dans les mêmes colonnes.

    Donc, pour une répartion en colonnes, on devrait avoir plutôt avoir :

    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
     
    // 4 colonnes de 0 à 3
    Noemie.gridx=0;
    Etienne.gridx=1;
    Maxime.gridx=2;
    Hadrien.gridx=3;
     
    Noemie.gridy=Etienne.gridy=Maxime.gridy=Hadrien.gridy=0; // ligne 1
     
    TxtNoemie.gridx=Noemie.gridx;
    TxtEtienne.gridx=Etienne.gridx;
    TxtMaxime.gridx=Maxime.gridx;
    TxtHadrien.gridx=Hadrien.gridx;
     
    TxtNoemie.gridy=TxtEtienne.gridy=TxtMaxime.gridy=TxtHadrien.gridy=1; // ligne 2
     
    retour.gridx=1;
    retour.gridy=2; // ligne 3
    Ensuite ipadx et ipady ne permettent pas de donner une dimension aux éléments : ils permettent de définir un padding : un espacement ajouté à la taille minimum des composants. Il n'y a pas moyen, dans un GridBagLayout, de contraindre un JLabel une largeur plus petite que celle qu'il est censé avoir d'après son texte. Mais on peut s'en sortir en mettant la contrainte sur le JLabel lui-même d'une part, et en jouant avec les contraintes du GridBagLayout.

    On peut forcer la taille du JLabel, en indiquant sa preferredSize : par contre, sans faire des calculs complexes, si on peut imposer une largeur, il est plus difficile d'imposer une hauteur, car elle dépend du texte et de largeur qu'on impose. Plutôt que de calculer cette hauteur, on va mettre une hauteur arbitraire et on va utiliser les contraintes du GridBagLayout pour la hauteur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TexteHadrien.setPreferredSize(new Dimension(100,200));
    TexteNoemie.setPreferredSize(new Dimension(100,200));
    TexteEtienne.setPreferredSize(new Dimension(100,200));
    TexteMaxime.setPreferredSize(new Dimension(100,200));
    Pour les contraintes dans le GridBadLayout, on va dire que le texte s'étend au maximum en hauteur (verticalement), et on va dire qu'il prend toute la place qui n'est pas occupée, soit 1 (100%).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TxtNoemie.fill=TxtEtienne.fill=TxtMaxime.fill=TxtHadrien.fill=GridBagConstraints.VERTICAL;
    TxtNoemie.weighty=TxtEtienne.weighty=TxtMaxime.weighty=TxtHadrien.weighty=1;
    Je ne sais pas ce que sont les composants AffichePhoto..., mais si c'est des JLabel avec un ImageIcon, ça devrait fonctionner. Sinon, il faudra adapter

    Avec ce paramétrage, les textes sont centrés en hauteur : pour qu'ils soient plaqués contre les photos au dessus, on va utiliser leur contrainte interne d'alignement (on les met au nord) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TexteHadrien.setVerticalAlignment(JLabel.NORTH);
    TexteNoemie.setVerticalAlignment(JLabel.NORTH);
    TexteEtienne.setVerticalAlignment(JLabel.NORTH);
    TexteMaxime.setVerticalAlignment(JLabel.NORTH);
    Reste le bouton : il est seul sur sa ligne, donc on va dire qu'il prend les 4 colonnes, mais ne s'étend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    retour.gridx=0; 
    retour.gridy=2; // ligne 3
    retour.gridwidth=4; // 4 cases en largeur
    retour.anchor=GridBagConstraints.CENTER; // centré
    Maintenant, je vois que tu as commenté p.add(txt,Texte);. Si tu décommentes cette ligne, ce ne va plus fonctionner, puisqu'on va avoir une ligne de plus. En plus, il faut configurer l'emplacement (la GridBagConstraint du Texte), sur un principe similaire que celui du bouton retour (sauf que là, on s'étend) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Texte.gridx=0; 
    Texte.gridy=0; 
    Texte.gridwidth=4; // 4 cases en largeur
    Texte.fill=GridBagConstraints.BOTH; // on s'étend en largeur et hauteur
    Evidemment, il faut décaler les lignes pour les autres composants (de 1). Avec ce paramétrage, on a toutefois un problème : comme on a contraint les textes à 150 de largeur, ils ne vont pas s'étaler sur toute la largeur, mais le dernier si, car le GridBagLayout fonctionne comme ça. Du coup on se retrouve avec 3 colonnes à gauche, et une qui se centre dans ce qui reste de place. Pour répartir les 4 colonnes, il suffit de dire qu'on veut qu'elles se répartissent équitablement l'espace, par weightx=1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TxtNoemie.weightx=TxtEtienne.weightx=TxtMaxime.weightx=TxtHadrien.weightx=1;
    On peut même, en plus, dire que les colonnes s'étalent sur la largeur, si tu veux, en changeant la contrainte fill (BOTH au lieu de VERTICAL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TxtNoemie.fill=TxtEtienne.fill=TxtMaxime.fill=TxtHadrien.fill=GridBagConstraints.BOTH;
    (essaye avec ou sans pour voir la différence)
    Mais la conséquence est qu'avec une fenêtre très large, le texte en première ligne sera casé à gauche. Pour le centrer, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txt.setHorizontalAlignment(JLabel.CENTER); // centre le texte
    Par ailleurs, les insets sont des marges. Elles peuvent introduire des légers décalages sur les centrages quand la marge droite et gauche ne sont pas les mêmes. Tu peux utiliser les insets si tu veux mettre un espace entre les composants.

    Enfin, il y aurait d'autres choses à dire, mais tu découvriras ça, et tu viendras peut-être sur le forum créer de nouvelles discussions. Par exemple, tu mets un ActionListener sur le bouton retour qui ferme la fenêtre, mais tu as indiqué que l'application devait s'arrêter lorsqu'on fermait la fenêtre, par setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Une dernière chose, voici le code final qui résumé tout ce que j'ai dit : j'y ai ajouté du code pour montrer comment on peut gérer la taille de la fenêtre et sa position, pour qu'elle ne soit pas trop grande. Tu verras que avec cette taille, et même, avec la taille arbitraire que tu as mise, il n'y a pas besoin de scrollbar. J'ai mis une ligne de code en commentaire avec une taille qui permet de voir la scrollbar, si tu veux.

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    public class FenetreCredit extends JFrame {
    		private GridBagLayout gridBag =new GridBagLayout();
    		private JButton retour;
    		private JLabel TexteHadrien;
    		private JLabel TexteNoemie;
    		private JLabel TexteEtienne;
    		private JLabel TexteMaxime;
    		private PanneauFond p = new PanneauFond();
    		private JScrollPane scroll;
     
    	public FenetreCredit (){
    		super("FenetreCredit");
    	///Différent Panneaux et Frame Utiles:
    		AffichePhotoNoemie Nono= new AffichePhotoNoemie();
    		AffichePhotoEtienne Titi = new AffichePhotoEtienne();
    		AffichePhotoMaxime Max= new AffichePhotoMaxime();
    		AffichePhotoHadrien Hadri=new AffichePhotoHadrien();
     
    		p.setLayout(new GridBagLayout());
    		//setLayout(gridBag);
    	///Déclaration et Spécificité des GridBagLayout
    		GridBagConstraints Texte = new GridBagConstraints();
    		GridBagConstraints Noemie = new GridBagConstraints();
    		GridBagConstraints Etienne = new GridBagConstraints();
    		GridBagConstraints Maxime =new GridBagConstraints();
    		GridBagConstraints Hadrien = new GridBagConstraints();
    		GridBagConstraints TxtNoemie = new GridBagConstraints();
    		GridBagConstraints TxtEtienne = new GridBagConstraints();
    		GridBagConstraints TxtMaxime =new GridBagConstraints();
    		GridBagConstraints TxtHadrien = new GridBagConstraints();
    		GridBagConstraints retour = new GridBagConstraints();
     
    		Texte.gridx=0; 
    		Texte.gridy=0; 
    		Texte.gridwidth=4; // 4 cases en largeur
    		Texte.fill=GridBagConstraints.BOTH;
     
    		Noemie.gridx=0;
    		Etienne.gridx=1;
    		Maxime.gridx=2;
    		Hadrien.gridx=3;
     
    		Noemie.gridy=Etienne.gridy=Maxime.gridy=Hadrien.gridy=1; // ligne 1
     
     
    		TxtNoemie.gridx=Noemie.gridx;
    		TxtEtienne.gridx=Etienne.gridx;
    		TxtMaxime.gridx=Maxime.gridx;
    		TxtHadrien.gridx=Hadrien.gridx;
     
    		TxtNoemie.gridy=TxtEtienne.gridy=TxtMaxime.gridy=TxtHadrien.gridy=2; // ligne 2
     
    		TxtNoemie.fill=TxtEtienne.fill=TxtMaxime.fill=TxtHadrien.fill=GridBagConstraints.BOTH;
    		TxtNoemie.weightx=TxtEtienne.weightx=TxtMaxime.weightx=TxtHadrien.weightx=1;
    		TxtNoemie.weighty=TxtEtienne.weighty=TxtMaxime.weighty=TxtHadrien.weighty=1;
     
    		retour.gridx=0;
    		retour.gridy=3; // ligne 3
    		retour.gridwidth=4; // 4 cases en largeur
    		retour.anchor=GridBagConstraints.CENTER;
     
     
     
    		// suppression du padding
    		/*Noemie.ipadx=100;//Dimensionnement des "cases" accueillant les photos, le gridBagLayout divisant la fenetre en cases:
    		Noemie.ipady=150;
    		Etienne.ipadx=100;
    		Etienne.ipady=150;
    		Maxime.ipadx=100;
    		Maxime.ipady=150;
    		Hadrien.ipadx=100;
    		Hadrien.ipady=150;
    		TxtHadrien.ipadx=250;
    		TxtNoemie.ipadx=250;
    		TxtEtienne.ipadx=250;
    		TxtMaxime.ipadx=250;
    		Texte.ipadx=250;*/
     
    		// même insets partout
    		Texte.insets=new Insets (5,5,5,5);
    		Noemie.insets=Etienne.insets=Maxime.insets=Hadrien.insets=new Insets (10,0,10,0);
    		//retour.insets=new Insets (10,0,10,0);
     
    	//Création des éléments de la fenetre
    		JLabel txt = new JLabel ("<html>Le Tangram est un jeu solitaire, plus précisément un casse-tête chinois.<br>Le but de ce puzzle est de juxtaposer différentes pièces afin de reproduire une forme donnée comme: <br> une forme d'animal, un personnage, ou tout simplement une forme artistique.<br>Historiquement, la légende dit qu'un empereur chinois du XVIe siècle du nom de «Tan», fit tomber un carreau de faïence qui se brisa en 7 morceaux.<br> Il n'arriva jamais à* rassembler les morceaux pour reconstituer le carreau<br> mais l'homme s'aperçut qu'avec les 7 pièces,<br> il était possible de créer quantités de formes multiples, d'où l origine du jeu de Tangram.<br>L'application présentée ici a pour but de vous divertir et de développer votre créativité et votre logique.<br>Bon jeu!");
    		txt.setHorizontalAlignment(JLabel.CENTER); // centre le texte
     
    		JLabel TexteHadrien=new JLabel("<html>Si notre application est aussi stylée, c'est grâce à Hadrien, le designer de l'application.<br> Il a créé toutes les fenêtres du jeu Tangram.<br> Il est également à l'origine de la gestion des scores."); 
    		JLabel TexteNoemie= new JLabel("<html>Noémie est la chef de projet.<br> Elle coordonne le groupe pour, par exemple, terminer le projet dans les temps.<br> Elle est également la développeuse de ce site. Même si le langage Java n'est pas son point fort,<br> elle a tout de même codé quelques lignes de l'application: <br>les indices et l'enregistrement des scores ont été codé par elle.");
    		JLabel TexteEtienne= new JLabel("<html>Si vous pouvez déplacer et faire tourner les formes, c'est grâce à Etienne!<br> Avec Maxime, il a créé les sept formes qui permettent de réaliser les figures du Tangram.<br> Il a également codé les méthodes qui permettent de déplacer, tourner les pièces... <br>Si vous avez la chance de pouvoir jouer en mode chrono, c'est aussi grâce à lui.");
    		JLabel TexteMaxime= new JLabel("<html>Maxime c'est le pro de la base de données.<br> C'est grâce à lui que l'application propose des figures aussi variées.<br> Il a aussi travaillé avec Etienne pour la cration des sept formes de base,<br> et pour le mode chronomètre.");
    		JButton Retour = new JButton ("Retour");
     
    		TexteHadrien.setPreferredSize(new Dimension(100,200));
    		TexteHadrien.setVerticalAlignment(JLabel.NORTH);
    		TexteNoemie.setPreferredSize(new Dimension(100,200));
    		TexteNoemie.setVerticalAlignment(JLabel.NORTH);
    		TexteEtienne.setPreferredSize(new Dimension(100,200));
    		TexteEtienne.setVerticalAlignment(JLabel.NORTH);
    		TexteMaxime.setPreferredSize(new Dimension(100,200));
    		TexteMaxime.setVerticalAlignment(JLabel.NORTH);
     
    	//Listener pour le bouton Reprendre
     
    		Retour.addActionListener(new ActionListener(){
    			public void actionPerformed (ActionEvent e){
    				//new Son("sons/EXPLOSION.WAV");			
    				//new FenetreMenu();
    				dispose();	//Pour fermer la fenetre avant de passer Ã* la suivante
    			}
    		});
     
    	//Ajout au panel:
    		p.add(txt,Texte);
    		p.add(Nono,Noemie);
    		p.add(TexteNoemie, TxtNoemie);
    		p.add(TexteEtienne, TxtEtienne);
    		p.add(TexteMaxime, TxtMaxime);
    		p.add(Titi,Etienne);
    		p.add(TexteHadrien, TxtHadrien);
    		p.add(Max,Maxime);
    		p.add(Hadri,Hadrien);
    		p.add(Retour, retour);
     
    		scroll = new JScrollPane(p, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    		//setContentPane(p);
    		getContentPane().add(scroll);
    		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		pack();
    		setSize(getWidth(),700);
    		// setSize(getWidth(),300); // Avec cette hauteur, tu verras la scrollbar
    		setLocationRelativeTo(null); // centrage de la fenêtre
    		setResizable(false);
    		setVisible (true);
     
     
    	}
    	public static void main(String[] a) {
    		new FenetreCredit();
    	}
     
     
    }
    J'ajouterais en conclusion qu'on pourrait s'en sortir plus facilement en découpant la fenêtre en plusieurs parties (JPanel), avec chacune, son propre layout manager, et surtout avoir une fenêtre plus facilement dimensionnable sans imposer de contraintes arbitraires.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème affichage JScrollPane
    Par monalise dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 24/02/2012, 16h28
  2. Problème affichage dans JScrollPane
    Par alex2746 dans le forum Composants
    Réponses: 3
    Dernier message: 15/11/2010, 12h02
  3. Problème avec JScrollPane et label
    Par gl0be dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 26/11/2004, 17h08
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 14h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

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