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 :

JScrollPane(JPanel) - scroll inactif


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut JScrollPane(JPanel) - scroll inactif
    Bonjour,

    Mon problème est simple, j'ai des beaucoup de boutons dans un jpanel qui s'appelle command, je veux mettre ça dans un JScrollPane pour pouvoir faire défiler verticalement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		JScrollPane scCommand=new JScrollPane();
    		scCommand.setViewportView(command);
    Mon soucis c'est que le Scroll Vertical n'apparait pas et que je ne peux pas accèder aux boutons du bas. Si je force l'apparition du scroll, il est grisé et on ne peut pas déscendre. Aucun changement si je met command dans le constructeur de JScrollPane.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Utiliserais tu un layout null par le plus grand des hasards?

    Dans ce cas là oublies tout de suite ce layout, et utilises quelque chose de correct pour organiser ton GUI (Combinaison de BorderLayout, de BoxLayout, de GridBagLayout)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Je ne suis pas sur de comprendre
    Pour mon JPanel j'utilise un layout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel command=new JPanel(new FlowLayout());
    Mais toi tu parles de mettre un layout au JScrollPane, c'est ça ? Parce que j'ignore comment faire cela

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je parlais du layout du panel contenu dans le JScrollPane.

    Il n'a beau pas être nul, il est bien responsable de ton problème.
    En effet le FlowLayout possède la caractéristique suivante: il ajoute les composants de façon horizontale tant qu'il a de la place vers la fin du composant. S'il n'y a plus de place, il passe à la ligne. Or mettre ton JPanel dans un JScrollPane fait en sorte que l'espace horizontal disponible pour ton JPanel est infini (ou du moins quelque chose de la sorte ). De fait le FlowLayout n'estime pas avoir besoin de passer à la ligne. CQFD

    Pour remédier à cela, il faut ne plus utiliser le FlowLayout.

    Décrit nous ce que tu cherches à mettre en place comme interface, on te donnera le Layout le plus approprié

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Ok, en fait je veux mettre un panneau avec des boutons dans une des "cases" d'un jsplitpane. Du coup le panneau des boutons doit pouvoir être redimensionnable et que lorsqu'on le redimensionne les boutons se remettent bien pour être visibles mais qu'on puisse les atteindre quand il y en a caché.

    Pour des problèmes de présentation, il faut que ces boutons soit accessibles en faisant un scroll vertical et non horizontal. Le FlowLayout était donc idéal pour cela, les boutons se mettent sur la ligne suivante quand on redimensionne lateralement le jsplitpane et il me faudrait quelque chose de proche. En tout cas quelque chose où le nombre de boutons sur une ligne varie en fonction de la taille du panneau

  6. #6
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La solution ici passe par la création d'un layout spécifique héritant du FLowLayout, mais recalculant la preferredSize du composant en utilisant une taille maximale.

    Cf le post d'Adiguba dans ce forum: http://www.developpez.net/forums/d61...s/#post3634553

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut Scroll innactif dans un JScrollPane
    Bonjour,

    A cette adresse vous avez une vidéo du problème. Quand je monte la barre du bas je voudrais qu'un scroll verticale se mette pour qu'on puisse voir les boutons qui sont cachés. Mais rien ne se met alors qu'il y a un JScrollPane.

    Les codes ne sont pas très importants. Voilà la déclaration du JScrollPane (command est un JPanel qui contient les boutons avec un FlowLayout) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		JScrollPane scCommand=new JScrollPane();
    		scCommand.setViewportView(command);
    Le JScrollPane est ensuite mis dans un JSplitPane.

    Merci d'avance pour votre aide

  8. #8
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Voici une solution basée sur le WrapFLowLayout fourni plus haut (légèrement modifié pour le getMinimumSize) qui est fonctionnelle. Le WrapFlowLayout permet ce que vous cherchez à faire. C'est juste que vous l'utilisez probablement de la mauvaise façon, toutefois, n'ayant vu votre façon de faire, nous ne pouvons pas plus vous aider.

    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
     
    package layout;
     
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Insets;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
     
     
     
    class WrapFlowLayout extends FlowLayout {
        /* serialVersionUID */
        /* serialVersionUID */
        private static final long serialVersionUID = 1L;
     
        @Override
        public Dimension preferredLayoutSize(Container target) {
            final Container parent = target.getParent();
            if (parent != null) {
                final int width = parent.getWidth();
                return new Dimension(width, calculateHeight(target, width));
            }
            return super.preferredLayoutSize(target);
        }
     
        @Override
        public Dimension minimumLayoutSize(Container target) {
            /*final Container parent = target.getParent();
            if (parent != null) {
                final int width = parent.getWidth();
                return new Dimension(width, calculateHeight(target, width));
            }
            return super.minimumLayoutSize(target);*/
            return new Dimension(0,0);
        }
     
     
     
        /**
         * Calcule la hauteur du layout avec une largeur fixe
         */
        public int calculateHeight(Container target, int width) {
            Insets insets = target.getInsets();
            final int vgap = getVgap();
            final int hgap = getHgap();
            // On calcule la taille du contenu :
            final int innerWidth = Math.max(0, width - (insets.left + insets.right + hgap * 2));
            // On initialise la taille avec les marges
            int height = insets.top + insets.bottom + vgap;
     
            synchronized (target.getTreeLock()) {
                Dimension dim = new Dimension(0, 0);
     
                boolean firstVisibleComponent = true;
                final boolean useBaseline = getAlignOnBaseline();
                int maxAscent = 0;
                int maxDescent = 0;
     
                final int nmembers = target.getComponentCount();
                for (int i = 0; i < nmembers; i++) {
                    Component m = target.getComponent(i);
                    if (m.isVisible()) {
                        Dimension d = m.getPreferredSize();
     
                        if (firstVisibleComponent) {
                            // Si on est sur le premier composant, on doit l'ajouter :
                            dim.width = d.width;
                            dim.height = d.height;
                            firstVisibleComponent = false;
                        } else if ((dim.width + hgap + d.width) <= innerWidth) {
                            // Si on peut ajouter un composant sur la ligne, on le fait
                            dim.width += hgap + d.width;
                            dim.height = Math.max(dim.height, d.height);
                        } else {
                            // On ne peut plus ajouter de composants, on fait une nouvelle ligne
                            if (useBaseline) {
                                dim.height = Math.max(maxAscent + maxDescent, dim.height);
                            }
                            height += dim.height + vgap;
     
                            // Et on "met" le composant sur la nouvelle ligne
                            dim.width = d.width;
                            dim.height = d.height;
                            maxAscent = 0;
                            maxDescent = 0;
                        }
                        if (useBaseline) {
                            int baseline = m.getBaseline(d.width, d.height);
                            if (baseline >= 0) {
                                maxAscent = Math.max(maxAscent, baseline);
                                maxDescent = Math.max(maxDescent, d.height - baseline);
                            }
                        }
                    }
                }
                if (dim.height!=0) {
                    if (useBaseline) {
                        dim.height = Math.max(maxAscent + maxDescent, dim.height);
                    }
                    height += dim.height + vgap;
                }
                return height;
            }
        }    
     
     
        public static void main(String[] args) {
            JFrame f = new JFrame();
     
            JPanel p = new JPanel();
            p.setLayout(new WrapFlowLayout());
            for (int i = 0; i<25;i++) {
                p.add(new JButton("a"));
            }
            JSplitPane sp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
            JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
            JSplitPane sp3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
            sp3.setRightComponent(new JPanel());
            sp3.setLeftComponent(new JScrollPane(p));
            sp2.setRightComponent(sp3);
            sp2.setLeftComponent(new JPanel());
            sp1.setTopComponent(sp2);
            sp1.setBottomComponent(new JPanel());
            f.add(sp1);
            f.setSize(1024,768);
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setVisible(true);
        }
    }
    Cdt
    Sinok.

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

Discussions similaires

  1. JScrollPane et scrolling
    Par shinchun dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/07/2007, 12h23
  2. probleme JPanel + scroll
    Par Panther.I dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2007, 10h47
  3. Déplacement avec la souris dans un JScrollPane/JPanel
    Par deadstar62 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 27/04/2007, 17h10
  4. Mon JScrollPane ne scroll pas
    Par sorry60 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 11/12/2006, 09h53
  5. JScrollPane + JPanel: Redimension inopérante
    Par lionrouge dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 27/06/2006, 11h09

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