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 :

FlowLayout dans JScrollPane


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut FlowLayout dans JScrollPane
    Bonjour,
    J'ai un JPanel avec un FlowLayout que je remplis de JLabel. Les labels sont bien répartis dans toute la place disponible. Ce panel est dans un GridBagLayout. Donc dans certains cas, il n'y a pas assez de place pour tout afficher et j'ai donc décider de mettre un JScrollPane (en fait un Jidesoft.SimpleScrollPane).

    Problème, le FlowLayout n'utilise maintenant plus tout la hauteur disponible, puisque le viewport du scrollpane lui donne une largeur infinie pour se peindre. Tous mes labels sont donc sur une seule ligne.
    Je voudrais que le layout continue à utiliser toute la hauteur possible et dépasse de la largeur du viewport uniquement si nécessaire.

    Dans un 1er temps j'ai écrit un nouveau LayoutManager basé sur le FlowLayout qui utilise la dimension du viewport comme base plutôt que la largeur du panel. C'est une 1ère approximation de ce que je veux en final qui fonctionne comme je m'y attendais. Les labels sont uniquement disposés sur la largeur du viewport, et dépassent verticalement si nécessaire.

    Seul problème dans cette 1ère version est que la scrollbar horizontale apparaît toujours, car le panel semble avoir conservé la même largeur que si tous les labels étaient mis l'un à côté de l'autre.

    D'où ma question dans chaîne du layout des composants:
    comment est déterminée la largeur du panel ? Est-ce que cela a avoir avec les méthodes preferredLayoutSize(Container target) et minimumLayoutSize(Container target) ?
    (Est-ce qu'il existe une doc qui explicite un peu cette chaîne ? Je m'y perds...)

    Merci,

    Laurent

  2. #2
    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,

    Citation Envoyé par lvr Voir le message
    D'où ma question dans chaîne du layout des composants:
    comment est déterminée la largeur du panel ? Est-ce que cela a avoir avec les méthodes preferredLayoutSize(Container target) et minimumLayoutSize(Container target) ?
    (Est-ce qu'il existe une doc qui explicite un peu cette chaîne ? Je m'y perds...)
    En fait ce n'est pas si simple car chaque placement/taille de composant est lié à un layout-manager, et chaque layout-manager peut prendre en compte les valeurs de minimum/maximum/preferredSize ou pas...


    Dans le cas d'un JScrollPane standard, l'objectif est d'afficher le composant au mieux donc c'est la preferredSize qui est utilisé. Il faut donc que ton Layout renseigne correctement cette taille.


    Tu pourras trouver un exemple ici : http://www.developpez.net/forums/d61...s/#post3634553


    a++

  3. #3
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    En fait ce n'est pas si simple car chaque placement/taille de composant est lié à un layout-manager, et chaque layout-manager peut prendre en compte les valeurs de minimum/maximum/preferredSize ou pas...
    Ce sont ces "ou pas..." qui rendent parfois difficile de faire de beaux panneaux sans perdre des heures à chipoter
    Citation Envoyé par adiGuba Voir le message
    Tu pourras trouver un exemple ici : http://www.developpez.net/forums/d61...s/#post3634553
    C'est vers ça que je me dirigeais... mais dans le mauvais sens.
    Plutôt que d'adapter la méthodes layout(target) et je devrais exclusivement adapter les minimum/preferredLayoutSize comme tu suggères puis laisser le layout(parent) travailler sur base de la nouvelle taille donnée par la scrollpane.
    Merci

  4. #4
    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
    Citation Envoyé par lvr Voir le message
    Ce sont ces "ou pas..." qui rendent parfois difficile de faire de beaux panneaux sans perdre des heures à chipoter
    Oui mais en même temps c'est logique puisque c'est le layout qui décide de la manière dont il va représenter les composants. Il prend donc ses décisions selon les critères de son choix, pour arriver au rendu qu'il souhaite.

    Mais c'est clair que ce n'est pas toujours évident...

    a++

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 27
    Par défaut
    Salut,

    J'ai du faire face au même problème que toi il y a quelques temps. Après mes recherches, j'ai trouvé cette classe qui marche très bien.

    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
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    import java.awt.*;
     
    public class ModifiedFlowLayout extends FlowLayout
    {
        public ModifiedFlowLayout()
        {
            super();
        }
     
        public ModifiedFlowLayout(int align)
        {
            super(align);
        }
     
        public ModifiedFlowLayout(int align, int hgap, int vgap)
        {
            super(align, hgap, vgap);
        }
     
        public Dimension minimumLayoutSize(Container target)
        {
            return computeSize(target, false);
        }
     
        public Dimension preferredLayoutSize(Container target)
        {
            return computeSize(target, true);
        }
     
        private Dimension computeSize(Container target, boolean minimum)
        {
            synchronized (target.getTreeLock())
            {
                int hgap = getHgap();
                int vgap = getVgap();
                int w = target.getWidth();
     
           // Let this behave like a regular FlowLayout (single row)
           // if the container hasn't been assigned any size yet    
                if (w == 0)
                    w = Integer.MAX_VALUE;
     
                Insets insets = target.getInsets();
                if (insets == null)
                    insets = new Insets(0, 0, 0, 0);
                int reqdWidth = 0;
     
                int maxwidth = w - (insets.left + insets.right + hgap * 2);
                int n = target.getComponentCount();
                int x = 0;
                int y = insets.top;
                int rowHeight = 0;
     
                for (int i = 0; i < n; i++)
                {
                    Component c = target.getComponent(i);
                    if (c.isVisible())
                    {
                        Dimension d =
                            minimum ? c.getMinimumSize() :     
                     c.getPreferredSize();
                        if ((x == 0) || ((x + d.width) <= maxwidth))
                        {
                            if (x > 0)
                            {
                                x += hgap;
                            }
                            x += d.width;
                            rowHeight = Math.max(rowHeight, d.height);
                        } else
                        {
                            x = d.width;
                            y += vgap + rowHeight;
                            rowHeight = d.height;
                        }
                        reqdWidth = Math.max(reqdWidth, x);
                    }
                }
                y += rowHeight;
                return new Dimension(reqdWidth+insets.left+insets.right, y);
            }
        }
    }

  6. #6
    lvr
    lvr est déconnecté
    Membre éclairé Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Lamarios, adiGuba, Merci.
    J'ai implémenté une solution similaire hier soir (objectif: ne jamais avoir de scrollbar verticale, mais tout de même utiliser toute la hauteur disponible) et cela marche presque nickel.

    En static, les composants sont correctement positionnés.

    Par contre quand je redimensionne le panneau qui contient le scrollpane (le scrollpane est dans un panneau d'un Jsplittedpane, panneau géré par un GridBagLayout), les éléments dans scrollpane ne sont pas redisposés.

    Comment faire pour que lorsque je déplace la barre de séparation de mon splittedpane et que le gridbaglayout réassigne des dimensions à mes composants, tout le process du layout de mon SuperFlowLayout soit relancé ?
    Est-ce qu'il faut que je détecte le déplacement de la barre du splittedpane pour faire un validetree() ou quelque chose comme ça ?

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

Discussions similaires

  1. Défilement automatique JTable dans JscrollPane
    Par jdewalqu dans le forum Composants
    Réponses: 3
    Dernier message: 24/08/2006, 18h28
  2. Probleme [SWING]: JPanel dans JscrollPane
    Par malandro dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/05/2006, 22h02
  3. panel dans jscrollpane
    Par let_me_in dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/02/2006, 17h54
  4. [Swing] Désactiver roulette dans JScrollPane?
    Par Quintoff dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 14/01/2006, 19h39
  5. [Débutant] JPanel dans JScrollPane
    Par Nicolas_75 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 06/04/2005, 10h39

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