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 :

[Débutant] JPanel dans JScrollPane


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut [Débutant] JPanel dans JScrollPane
    Bonjour,

    Je cherche à rajouter pendant le déroulement de mon application des éléments (JLabel) au sein d'un JPanel, et souhaite qu'une barre de défilement apparaisse quand le JPanel est "plein" de manière à voir l'ensemble des éléments.

    Le code suivant, Code1, fonctionne :

    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
    import java.awt.*;
    import javax.swing.*;
    public class Code1 {
        public static void main(String[] args) {
            // initialisation de la frame :
            JFrame maFrame = new JFrame();
            maFrame.setSize(100,400);
            maFrame.setResizable(false);
            maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // Container associé à la frame
            Container contentPane = maFrame.getContentPane(); // Code1
            // une boîte verticale englobée dans un JScrollPane, destinée à recevoir des éléments :
            JPanel verticalBoxPanel = new JPanel();
            verticalBoxPanel.setLayout(new BoxLayout(verticalBoxPanel, BoxLayout.Y_AXIS));
            JScrollPane scroll = new JScrollPane(verticalBoxPanel);
            // affichage de la frame :
            contentPane.add(scroll);
            maFrame.setVisible(true);
            // la frame étant affichée, on rajoute des labels :
            for (int i=0; i<50; i++) {
                verticalBoxPanel.add(new JLabel("Label "+i));
                verticalBoxPanel.revalidate();
                try {Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}
            }
        }
    }
    Toutefois, je souhaite utiliser le "contentPane" ci-dessus, contenant ma boîte verticale scrollable, n'importe où au sein de mon GUI, et en particulier dans un autre JPanel. Dans le présent exemple, je veux donc transformer le "JFrame.getContentPane" de Code1 en "JFrame.setContentPane"

    D'où le Code2 ci-dessous, mais il ne fonctionne pas (au sens où la barre de défilement n'apparait pas, et je n'ai donc pas accès aux derniers éléments). L'un d'entre vous pourrait-il me faire profiter de ses lumières pour m'aider à comprendre ?

    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
    import java.awt.*;
    import javax.swing.*;
    public class Code2 {
        public static void main(String[] args) {
            // initialisation de la frame :
            JFrame maFrame = new JFrame();
            maFrame.setSize(100,400);
            maFrame.setResizable(false);
            maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // Container associé à la frame
            JPanel contentPane = new JPanel(); // Code2
            maFrame.setContentPane(contentPane); // Code2 // contentPane est bien opaque
            // une boîte verticale englobée dans un JScrollPane, destinée à recevoir des éléments :
            JPanel verticalBoxPanel = new JPanel();
            verticalBoxPanel.setLayout(new BoxLayout(verticalBoxPanel, BoxLayout.Y_AXIS));
            JScrollPane scroll = new JScrollPane(verticalBoxPanel);
            // affichage de la frame :
            contentPane.add(scroll);
            maFrame.setVisible(true);
            // la frame étant affichée, on rajoute des labels :
            for (int i=0; i<50; i++) {
                verticalBoxPanel.add(new JLabel("Label "+i));
                verticalBoxPanel.revalidate();
                contentPane.revalidate(); // Code2
                try {Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}
            }
        }
    }
    Merci d'avance,

    Nicolas

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,
    Je suis pas completement sur de moi mais je crois que le LayoutManager par defaut pour un JFrame c'est le BorderLayout alors que pour un JPanel c'est le FlowLayout.
    Donc si tu veux avoir le meme effet dans les code 1 et 2, il suffit que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Container contentPane = maFrame.getContentPane();
    contentPane.setLayout(new BorderLayout());
    Voila, en esperant t'etre utile.
    sylvain_2020

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Merci, Sylvain.

    En prenant ton idée, j'ai modifié mon Code2. Dans ce code, c'est une JPanel qui englobe la boîte verticale scrollable (qui ne marchait pas). Par défaut, elle dispose d'un FlowLayout. Je lui impose maintenant un BorderLayout (gestionnaire par défaut des containers de frame) pour me retrouver dans une situation analogue à Code1 et son getContentPane.

    J'ai donc rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    contentPane.setLayout(new BorderLayout()); // -- AJOUT --
    Maintenant, cela fonctionne (quand la JPanel est "pleine" d'éléments ajoutés, la JScrollBar apparaît et joue son rôle).

    Code complet Code2bis :
    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
    import java.awt.*;
    import javax.swing.*;
    public class Code2bis {
        public static void main(String[] args) {
            // initialisation de la frame :
            JFrame maFrame = new JFrame();
            maFrame.setSize(100,400);
            maFrame.setResizable(false);
            maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // Container associé à la frame
            JPanel contentPane = new JPanel(); // Code2
            contentPane.setLayout(new BorderLayout()); // -- AJOUT --
            maFrame.setContentPane(contentPane); // Code2 // contentPane est bien opaque
            // une boîte verticale englobée dans un JScrollPane, destinée à recevoir des éléments :
            JPanel verticalBoxPanel = new JPanel();
            verticalBoxPanel.setLayout(new BoxLayout(verticalBoxPanel, BoxLayout.Y_AXIS));
            JScrollPane scroll = new JScrollPane(verticalBoxPanel);
            // affichage de la frame :
            contentPane.add(scroll);
            maFrame.setVisible(true);
            // la frame étant affichée, on rajoute des labels :
            for (int i=0; i<50; i++) {
                verticalBoxPanel.add(new JLabel("Label "+i));
                verticalBoxPanel.revalidate();
                contentPane.revalidate(); // Code2
                try {Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}
            }
        }
    }
    Cela résoud mon problème, mais j'avoue ne pas saisir encore pourquoi mon Code2 initial ne fonctionne pas avec un JPanel sous FlowLayout.

    Nicolas

  4. #4
    LSL
    LSL est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    oui moi aussi j'aimerais bien qu'on m'explique prquoi le code 2 initial ne marche pas !

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

Discussions similaires

  1. Taille JPanel dans JScrollPane
    Par Ceubex dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 27/09/2012, 19h45
  2. [Swing] JPanel dans JScrollPane ça ne marche pas !
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 23/11/2010, 00h16
  3. Specifier hauteur JPanel dans JScrollPane
    Par snay13 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 20/09/2010, 20h27
  4. probleme JPanel dans JScrollPane
    Par hbar01 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 30/05/2008, 19h37
  5. Probleme [SWING]: JPanel dans JscrollPane
    Par malandro dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/05/2006, 21h02

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