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 :

utilisation de JScrollPane


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é
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 52
    Par défaut utilisation de JScrollPane
    Bonjour,
    J'ai un petit soucis avec JScrollPane :
    Code java : 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
     
    //partie comptes
            JPanel panelComptes = new JPanel();
            panelComptes.setPreferredSize(new Dimension(160, 310));
            /*intérieur partie*/
            panelComptes.setLayout(new GridBagLayout());
            GridBagConstraints gbcComptes = new GridBagConstraints();
            gbcComptes.gridx = 0;
            gbcComptes.gridy = 0;
            gbcComptes.fill = 1;
            gbcComptes.weightx = 1;
     
            JLabel titreComptes = new JLabel("Comptes");
            titreComptes.setPreferredSize(new Dimension(140, 15));
            titreComptes.setBackground(Color.pink);
            titreComptes.setHorizontalAlignment(JLabel.CENTER);
            titreComptes.setOpaque(true);
            panelComptes.add(titreComptes, gbcComptes);
            gbcComptes.gridy++;
            ArrayList<Compte> comptes = c.getComptes();
            for (Compte compte : comptes) {
                JLabel lab = new JLabel(compte.getNom());
                lab.setPreferredSize(new Dimension(140, 15));
                lab.setHorizontalAlignment(JLabel.CENTER);
                panelComptes.add(lab, gbcComptes);
                gbcComptes.gridy++;
            }
            JButton ajoutCompte = new JButton("Ajout compte");
            ajoutCompte.addActionListener(new NouveauCompteListener(this.c));
            ajoutCompte.setHorizontalAlignment(JLabel.CENTER);
            ajoutCompte.setVerticalAlignment(JLabel.NORTH);
            ajoutCompte.setOpaque(true);
            panelComptes.add(ajoutCompte, gbcComptes);
            gbcComptes.gridy++;
            JLabel extraSpace = new JLabel();
            gbcComptes.weighty = 1;
            panelComptes.add(extraSpace, gbcComptes);
            /*fin intérieur comptes*/
            gbc.gridheight = 4;
            JScrollPane scrollPanelComptes = new JScrollPane(panelComptes);
            this.add(scrollPanelComptes, gbc);
            gbc.gridheight = 1;
    A l'intérieur d'un JPanel (le "this"), je veux mettre un JPanel avec dedans entre autres une liste qui aura donc un scroll.
    Problème : même avec le scroll, soit les JLabels sont étriqués et se marchent dessus comme ici, soit je mets plutôt des setMinimumSize et setMaximumSize, et du coup malgré le setMaximumSize le JPanel s'aggrandit avec les JPanels...

    Bref, je fais sans aucun doute un truc mal. Quoi qu'est-ce ?

    Merci d'avance pour votre aide !

  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 : 56
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'agencement dépend aussi du gestionnaire du JPanel conteneur. Quel-est il ?
    Je pense que le problème de superposition vient de la taille préférentielle que tu imposes à panelComptes. Laisse le layout calculer la taille du composant tout seul (en fonction de son contenu et de son layout).

    Dans un GridBagLayout, à la base la taille préférentielle sert à déterminer la taille préférentielle, limitée par les tailles minimum et maximum. Ensuite intervient la contrainte. Avec un fill à GridBagConstraints.BOTH (le fill=1 que tu as mis), le composant va chercher à prendre une partie de l'espace non consommé, en fonction de weightx (en horizontal) et weighty (en horizontal). Avec une valeur 0, le composant se partage toute la place disponible. Avec une valeur >0, il se partage la place avec un poids particulier. L'espace disponible dépend de l'espace pris par les composants.

    Avec le code :
    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
    JFrame frame = new JFrame("");
     
    JPanel panel = new JPanel(new GridBagLayout());
     
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx=0;
    gbc.gridy = GridBagConstraints.RELATIVE;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 0;
     
    for(int i=0; i<10; i++) {
        JLabel label = new JLabel("Label "+(i+1)); 
        label.setPreferredSize(new Dimension(50,15));
        panel.add(label,gbc);
    }
     
    frame.add(new JScrollPane(panel));
     
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,100);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    S'il y a la place en hauteur pour afficher tous les JLabel, ils s'affichent accolés au milieu :

    Nom : Capture.JPG
Affichages : 161
Taille : 18,0 Ko

    Avec le code (j'ai juste passé le weighty de 0 à 1) :
    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
    JFrame frame = new JFrame("");
     
    JPanel panel = new JPanel(new GridBagLayout());
     
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx=0;
    gbc.gridy = GridBagConstraints.RELATIVE;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
     
    for(int i=0; i<10; i++) {
        JLabel label = new JLabel("Label "+(i+1)); 
        label.setPreferredSize(new Dimension(50,15));
        panel.add(label,gbc);
    }
     
    frame.add(new JScrollPane(panel));
     
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,100);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    L'ensemble des JLabel s'étends sur toute la hauteur disponible, en ajoutant de l'espace entre composants (le même puisque weighty est le même pour tous) :
    Nom : Capture.JPG
Affichages : 161
Taille : 19,3 Ko

    En faisant :
    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
    JFrame frame = new JFrame("");
     
    JPanel panel = new JPanel(new GridBagLayout());
     
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx=0;
    gbc.gridy = GridBagConstraints.RELATIVE;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1; 
     
    for(int i=0; i<10; i++) {
        gbc.weighty = i+1;
        JLabel label = new JLabel("Label "+gbc.weighty); 
        label.setPreferredSize(new Dimension(50,15));
        panel.add(label,gbc);
    }
     
    frame.add(new JScrollPane(panel));
     
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,100);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    On obtient :
    Nom : Capture.JPG
Affichages : 162
Taille : 21,6 Ko

    Le JScrollPane utilise lui la taille préférentielle pour déterminer s'il faut afficher l'ascenceur.

    Avec
    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
    JFrame frame = new JFrame("");
     
    JPanel panel = new JPanel(new GridBagLayout());
     
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx=0;
    gbc.gridy = GridBagConstraints.RELATIVE;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
     
    for(int i=0; i<10; i++) {
        JLabel label = new JLabel("Label "+(i+1)); 
        label.setPreferredSize(new Dimension(50,15));
        panel.add(label,gbc);
    }
     
    panel.setPreferredSize(new Dimension(50, 150));
     
    frame.add(new JScrollPane(panel));
     
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,100);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    J'ai une fenêtre qui s'ouvre avec une hauteur de 100, et un panel de 150, donc une barre de défilement verticale. Si j'étends la hauteur, la barre est visible jusqu'à ce que le scrollpane laisse voir les 150 de haut puis disparaît. Si je continue, les labels s'espacent de plus en plus, du même espacement.

    Avec panel.setPreferredSize(new Dimension(50, 50));, j'ai évidemment un ramassement des labels (15 × 10 px de hauteur ramassés sur 50 px) et jamais de barre de défilement. Si j'étends en hauteur, je finis par avoir tous les labels visibles et accolés, puis leur espacement s'agrandit (comportement normal qui ne dépend pas de la taille du viewport).

    Nom : Capture.JPG
Affichages : 158
Taille : 14,1 Ko
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 52
    Par défaut
    Tout d'abord, merci énormément pour ta réponse si détaillée ! Tellement d'ailleurs que je ne pense pas avoir tout compris
    J'avais besoin que le JPanel ait ces dimensions exactement pour des raisons de "mise en page".
    Mais du coup en te lisant je crois avoir compris que finalement, on s'en fout de la taille du JPanel en question, il faut mettre le JScrollPane à ces dimensions. Je ne sais pas si j'ai bien compris mais en tous cas ça a l'air de marcher, donc merci beaucoup

  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 : 56
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par WAitWaitW Voir le message
    Tout d'abord, merci énormément pour ta réponse si détaillée ! Tellement d'ailleurs que je ne pense pas avoir tout compris
    J'avais besoin que le JPanel ait ces dimensions exactement pour des raisons de "mise en page".
    Dans ce cas, c'est au JScrollPane que tu dois affecter une taille préférentielle. Pas à son viewport qui lui scrolle à l'intérieur.
    Citation Envoyé par WAitWaitW Voir le message
    Mais du coup en te lisant je crois avoir compris que finalement, on s'en fout de la taille du JPanel en question, il faut mettre le JScrollPane à ces dimensions. Je ne sais pas si j'ai bien compris mais en tous cas ça a l'air de marcher, donc merci beaucoup
    Oui, voilà.
    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.

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

Discussions similaires

  1. aide a propos l'utilisation du JScrollPane
    Par alsouri dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 29/03/2017, 15h53
  2. probleme affichage : bonne utilisation de JScrollPane?
    Par magic92 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 27/05/2016, 22h16
  3. Utilisation de JScrollPane
    Par ChPr dans le forum 2D
    Réponses: 1
    Dernier message: 21/04/2007, 22h08
  4. Utilisation JScrollPane
    Par zoullou dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 17/05/2006, 17h13
  5. utilisation de JScrollPane
    Par Gimly dans le forum Composants
    Réponses: 3
    Dernier message: 25/06/2004, 16h23

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