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

AWT/Swing Java Discussion :

[Swing][JScrollPane]le Viewport ne s'adapte pas au contenu


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut [Swing][JScrollPane]le Viewport ne s'adapte pas au contenu
    Salut à tous !
    Je fais une petite IHM avec netbeans, rien de bien méchant.. En gros ça ressemble à un explorateur de fichiers avec à gauche un JTree et à droite un JPanel qui affiche un aperçu des images sélectionnées.. Mon problème, c'est que j'ai mis ce JPanel dans un JScrollPane et celui-ci ne s'adapte pas en fonction de la taille du JPanel.. Les barres de défilement ne s'affichent jamais ce qui limite l'intéret du JScrollPane ! J'ai le même problème avec le JTree mais j'arrive à bidouiller en remettant à jour le Viewport à chaque fois qu'un noeud est étendu/réduit. Voilà le code que j'ai tenté pour le 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
     
    //Code généré par netbeans
    ...
    jScrollPane1 = new javax.swing.JScrollPane();
    imageViewer = new javax.swing.JPanel();
    ...
    imageViewer.setMinimumSize(new java.awt.Dimension(0, 0));
    imageViewer.setPreferredSize(new java.awt.Dimension(0, 0));
    jScrollPane1.setViewportView(imageViewer);
    ...
     
    //Code exécuté lors du remplissage du JPanel :
     private void sessionsTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                          
            if(evt.getNewLeadSelectionPath() != null && (((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject().getClass()) == Session.class)
             {
                Session obj = (Session)(((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject());
                imageViewer.removeAll();
                for(int i=0 ; i<obj.getImages().size() ; i++)
                {
                    if(obj.getImages().get(i).isImageFile())
                        imageViewer.add(obj.getImages().get(i));
                }
                imageViewer.repaint();
                imageViewer.setPreferredSize(imageViewer.getSize());
                imageViewer.revalidate();
            }
        }
    Malgré les appels que j'ai rajouté, setPreferredSize() et revalidate(), les barres de défilement ne s'affichent jamais.. En fouillant sur le net j'ai vu que tout le monde se contentait d'instancier le JScrollPane avec comme argument son contenu.. Dans la doc Java ils disent que l'instanciation "à vide" puis le setViewportView est strictement équivalent à ça.. Ou est le problème alors ?
    Merci de votre aide !!

  2. #2
    Membre habitué Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Points : 148
    Points
    148
    Par défaut
    jScrollPane1 = new javax.swing.JScrollPane();
    imageViewer = new javax.swing.JPanel();

    faire ensuite:

    jScrollPane1.add(imageViewer);

    puis utiliser jScrollPane1 et non imageViewer

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par White Rabbit
    puis utiliser jScrollPane1 et non imageViewer
    Hmm ça veut dire koi exactement ? Il faut bien que j'ajoute mes images dans mon imageViewer sinon j'ai pas le flowLayout qui me met tout bien correctement.. ?

  4. #4
    Membre habitué Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Points : 148
    Points
    148
    Par défaut
    Magie : le JScrollPane "devient" le JPanel

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    OK, j'ai modifié mon code selon tes conseils pour obtenir le suivant :
    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
     
    private void sessionsTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                          
            if(evt.getNewLeadSelectionPath() != null && (((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject().getClass()) == Session.class)
             {
                Session obj = (Session)(((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject());
                jScrollPane1.removeAll();
                jScrollPane1.add(imageViewer);
                for(int i=0 ; i<obj.getImages().size() ; i++)
                {
                    if(obj.getImages().get(i).isImageFile())
                        jScrollPane1.add(obj.getImages().get(i));
                }
                jScrollPane1.repaint();
            }
        }
    mais là c'est encore pire, il n'y a plus rien qui s'affiche à la place du JScrollPane... Je me suis trompé quelque part ?

  6. #6
    Membre habitué Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Points : 148
    Points
    148
    Par défaut
    cherchage...

  7. #7
    Membre habitué Avatar de White Rabbit
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 122
    Points : 148
    Points
    148
    Par défaut
    Fait ces modifications :

    1 - Bon ça, ça change pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    jScrollPane1 = new javax.swing.JScrollPane();
    imageViewer = new javax.swing.JPanel();
     
    faire ensuite:
     
    jScrollPane1.add(imageViewer);
    2 - Par contre faire les opérations normalement sur le imageViewer (j'ai dit une bêtise précedement :s )

    3 - Modifier ton if pour qu'il soit plus lisible (il te manque tes parentèses pour que les priorités d'évaluation fassent ce que tu veux faire) :

    //Déclarer ref1 et ref2 selon le bon type
    ref1 = evt.getNewLeadSelectionPath();
    ref2 = ((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject().getClass();
    if ((ref1 != null) && (ref2 == Session.class)) { ...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Hmmoui, admettons, mais en gros ça revient à ce que j'avais fait à l'origine, mis à part le if plus clair.. Voilà le code que j'obtiens :
    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
     
    private void sessionsTreeValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                          
            Object ref1 = evt.getNewLeadSelectionPath();
            Object ref2 = ((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject().getClass();
            if((ref1 != null) && (ref2 == Session.class))
             {
                Session obj = (Session)(((DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent()).getUserObject());
     
                imageViewer.removeAll();
                for(int i=0 ; i<obj.getImages().size() ; i++)
                {
                    if(obj.getImages().get(i).isImageFile())
                        imageViewer.add(obj.getImages().get(i));
                }
                imageViewer.repaint();
                imageViewer.revalidate();
            }
        }
    Et donc c'est pas beaucoup mieux.. En fait c'est même moins bien, puisque le jScrollPane1.add(imageViewer) fait que le panel s'affiche dans le scrollPane et du coup on voit plus la totalité des images, ce qui est assez étrange d'ailleurs.. Petite note : il y a toujours le jScrollPane1.setViewportView(imageViewer), faut-il l'enlever ? Et si oui, comment faire puisqu'il est dans le code non-modifiable de netbeans.. ?

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par White Rabbit
    faire ensuite:

    jScrollPane1.add(imageViewer);
    J'ai de sérieux doutes là-dessus. Il faut utiliser setViewPortWiew()

    Je pense que le problème vient plutot du setPreferredSize(0, 0);. As tu essayé de l'enlever ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Ah gros progrès, j'ai enlenvé le setPreferredSize (en faisait un "Reset to default" sous netbeans) et la barre de défilement horizontal apparait !! Bon du coup il me met toutes les images sur une seule ligne avec une immense barre de défilement, mais ça je pense que je devrais pouvoir le régler avec un imageViewer.setMaximumSize(jScrollPane.getSize().x,0), je vais voir ça...

  11. #11
    En attente de confirmation mail
    Inscrit en
    Avril 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour

    j'ai un problème similaire, mais je ne vois pas d'où vient le problème. D'après ce que j'ai vu dans ce topic et sur Internet, ca devrait marcher

    Je voudrais pouvoir scroller choixAllModele, qui est un JPanel, mais ca ne marche pas (pas les barres de défilement) :


    Si quelqu'un a une idée, je suis tout ouie...

    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
    package gui.bdd;
     
     
    import javax.swing.JPanel;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
     
    public class ChoixModelebean extends JFrame {
     
        private JPanel jContentPane = null;
        private RechercheModeleBean rechercheModeleBean = null;
        private JScrollPane jScrollPane = null;
        private ChoixAllModele choixAllModele = null;
        /**
         * This is the default constructor
         */
        public ChoixModelebean() {
            super();
            initialize();
        }
     
        /**
         * This method initializes this
         *
         * @return void
         */
        private void initialize() {
            this.setSize(950, 484);
            this.setContentPane(getJContentPane());
            this.setTitle("Choississez les modèles");
        }
     
        /**
         * This method initializes jContentPane
         *
         * @return javax.swing.JPanel
         */
        private JPanel getJContentPane() {
            if (jContentPane == null) {
                jContentPane = new JPanel();
                jContentPane.setLayout(null);  // Generated
                jContentPane.setPreferredSize(new java.awt.Dimension(5,4));
                jContentPane.add(getRechercheModeleBean(), null);
                jContentPane.add(getJScrollPane(), null);
            }
            return jContentPane;
        }
     
        /**
         * This method initializes rechercheModeleBean
         *
         * @return gui.RechercheModeleBean
         */
        private RechercheModeleBean getRechercheModeleBean() {
            if (rechercheModeleBean == null) {
                try {
                    rechercheModeleBean = new RechercheModeleBean();
                    rechercheModeleBean.setBounds(new java.awt.Rectangle(10,10,910,30));  
                } catch (java.lang.Throwable e) {
                    // TODO: Something
                }
            }
            return rechercheModeleBean;
        }
     
        /**
         * This method initializes jScrollPane
         *
         * @return javax.swing.JScrollPane
         */
        private JScrollPane getJScrollPane() {
            if (jScrollPane == null) {
                try {
                    jScrollPane = new JScrollPane();
                    jScrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);  
                    jScrollPane.setViewportBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));  
                    jScrollPane.setLocation(new java.awt.Point(9,50)); 
                    jScrollPane.setSize(new java.awt.Dimension(500,200));
                    jScrollPane.setViewportView(getChoixAllModele());  
                    jScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
                } catch (java.lang.Throwable e) {
                    // TODO: Something
                }
            }
            return jScrollPane;
        }
     
        /**
         * This method initializes choixAllModele
         *
         * @return gui.ChoixAllModele
         */
        private ChoixAllModele getChoixAllModele() {
            if (choixAllModele == null) {
                try {
                    choixAllModele = new ChoixAllModele();
                } catch (java.lang.Throwable e) {
                    // TODO: Something
                }
            }
            return choixAllModele;
        }
     
    }  //  @jve:decl-index=0:visual-constraint="10,10"

    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
    package gui.bdd;
     
    import javax.swing.JPanel;
     
    public class ChoixAllModele extends JPanel {
     
        private ChoixUnModeleBean choixUnModeleBean = null;
        private ChoixUnModeleBean choixUnModeleBean1 = null;
        private ChoixUnModeleBean choixUnModeleBean2 = null;
        private ChoixUnModeleBean choixUnModeleBean3 = null;
        private ChoixUnModeleBean choixUnModeleBean4 = null;
        private ChoixUnModeleBean choixUnModeleBean5 = null;
        private ChoixUnModeleBean choixUnModeleBean6 = null;
        private ChoixUnModeleBean choixUnModeleBean7 = null;
        private ChoixUnModeleBean choixUnModeleBean8 = null;
        private ChoixUnModeleBean choixUnModeleBean9 = null;
        private ChoixUnModeleBean choixUnModeleBean10 = null;
     
        /**
         * This is the default constructor
         */
        public ChoixAllModele() {
            super();
            initialize();
        }
     
        /**
         * This method initializes this
         *
         * @return void
         */
        private void initialize() {
            this.setLayout(null);  // Generated
            this.setSize(910, 500);
            this.add(getChoixUnModeleBean(), null);  
            this.add(getChoixUnModeleBean1(), null); 
        }
     
        /**
         * This method initializes choixUnModeleBean
         *
         * @return gui.ChoixUnModeleBean
         */
        private ChoixUnModeleBean getChoixUnModeleBean() {
            if (choixUnModeleBean == null) {
                try {
                    choixUnModeleBean = new ChoixUnModeleBean();
                    choixUnModeleBean.setLocation(new java.awt.Point(0,0)); 
                    choixUnModeleBean.setSize(new java.awt.Dimension(125,185)); 
                } catch (java.lang.Throwable e) {
                    // TODO: Something
                }
            }
            return choixUnModeleBean;
        }
     
        /**
         * This method initializes choixUnModeleBean1
         *
         * @return gui.ChoixUnModeleBean
         */
        private ChoixUnModeleBean getChoixUnModeleBean1() {
            if (choixUnModeleBean1 == null) {
                try {
                    choixUnModeleBean1 = new ChoixUnModeleBean();
                    choixUnModeleBean1.setLocation(new java.awt.Point(130,0));  
                    choixUnModeleBean1.setSize(new java.awt.Dimension(125,185));
                } catch (java.lang.Throwable e) {
                    // TODO: Something
                }
            }
            return choixUnModeleBean1;
        }
    }

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Argh j'arrive pas à faire un joli explorateur.. Toutes les images se mettent sur une ligne c'est pas super ergonomique ! J'ai bien essayé de mettre le imageViewer dans un autre JPanel qui lui a un BoxLayout, avec mise à jour de la maximumSize quand le scrollPane est redimensionné, mais bof..
    Quelqu'un a une meilleure idée de comment organiser tout ça ? Pour ceux qui prennent en route, l'idée est de faire un explorateur style Explorateur Windows, et donc dans le JPanel de droite j'ai un flowLayout qui gère mes aperçus, mais quand je les ajoute il se rajoutent tous en ligne, et si je mets une maximumSize au panel qui les contient (imageViewer) ben ça change rien puisque le scrollPane ne tient compte que de la preferredSize.. ?

Discussions similaires

  1. div qui ne s'adapte pas à son contenu !
    Par Nanais19 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/11/2012, 09h55
  2. Span ne s'adapte pas à son contenu
    Par NeraOne dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 12/09/2011, 18h11
  3. TD ne s'adapte pas à son contenu
    Par Foums dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 11/02/2011, 14h08
  4. Taille d'un bloc ne s'adapte pas au contenu
    Par AurelienNF dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 06/11/2010, 13h06
  5. [XHTML 1.0] Div qui ne s'adapte pas au contenu lorsqu'on redimensionne la fenêtre
    Par alalalola dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/07/2010, 19h12

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