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 :

Pourquoi JScrollPanes long à afficher?


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 29
    Points
    29
    Par défaut Pourquoi JScrollPanes long à afficher?
    Bonjour, dans mon application JAVA j'utilise pas mal de JScrollpane contenant un JPanel dans lequel je place des éléments.
    A chaque fois, les JScrollpane sont relativement long à s'afficher lors du test de l'application et je ne comprend pas pourquoi. Même quand j'ai un code très simple come celui qui suit le JScrollpane met bien une demi seconde pour s'afficher à l'écran.. quelqu'un sait-il pourquoi et si il y a un moyen pour résoudre ce problème?



    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
    public class SuggestionsPanel extends javax.swing.JPanel {
     
        public SuggestionsPanel() {
            initComponents();
     
        }
     
     
        private void initComponents() {
     
            jScrollPane1 = new javax.swing.JScrollPane();
            jPanel1 = new javax.swing.JPanel();
            jLabel1 = new javax.swing.JLabel();
            jScrollBar1 = new javax.swing.JScrollBar();
     
            setLayout(null);
     
            jScrollPane1.setVerticalScrollBar(jScrollBar1);
     
            jPanel1.setBackground(new java.awt.Color(255, 51, 0));
            jPanel1.setPreferredSize(new java.awt.Dimension(400, 400));
            jPanel1.setLayout(null);
     
            jLabel1.setText("jLabel1");
            jPanel1.add(jLabel1);
            jLabel1.setBounds(100, 50, 40, 13);
     
            jScrollPane1.setViewportView(jPanel1);
     
            add(jScrollPane1);
            jScrollPane1.setBounds(350, 130, 451, 250);
            add(jScrollBar1);
            jScrollBar1.setBounds(220, 200, 15, 55);
        }
     
        private javax.swing.JLabel jLabel1;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JScrollBar jScrollBar1;
        private javax.swing.JScrollPane jScrollPane1;
     
    }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La faute au LayoutManager que tu utilises. Le pire de tous aka le NullLayout.

    Le setBounds & cie c'est à éviter comme la peste, en particulier avec les JScrollPane.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par sinok Voir le message
    La faute au LayoutManager que tu utilises. Le pire de tous aka le NullLayout.

    Le setBounds & cie c'est à éviter comme la peste, en particulier avec les JScrollPane.
    Bonjour,

    Du coup, si on a une image de fond sur un Jpanel entier et qu'on souhaite mettre un JButton (par exemple) en x,y, il faut utiliser quel code ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Paniez Voir le message
    Bonjour,

    Du coup, si on a une image de fond sur un Jpanel entier et qu'on souhaite mettre un JButton (par exemple) en x,y, il faut utiliser quel code ?

    Tu crée, ou tu réutilise depuis un framework tiers, un layoutmanager qui accepte de prendre des coordonées fixes. L'interface layoutmanager2 n'étant pas spécialement difficile à implémenter.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Les élements que tu places sur ton JPanel doivent être cliquables? Comment ajoutes tu ton image à ton JPanel. Que cherches tu à faire en fait.
    Car nettement il nous manque des infos en fait
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Re,

    A l'heure actuelle, quand je souhaite faire un JPanel avec des composants (n'importe lesquels et avec leur(s) action(s) associée(s)) et que je souhaite les mettre à un endroit précis (par la biais de coordonnées x,y), mis à part de passer par setBounds, je ne vois pas comment faire.
    C'est juste que si "Le setBounds & cie c'est à éviter comme la peste, en particulier avec les JScrollPane.", j'aimerais savoir comment changer ma méthodologie pour avoir un truc plus propre.

    Sinon, j'ai regardé côté layoutmanager2, mais je ne vois pas en quoi ça règlerais le problème.


    Merci

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ca reglerais le problème car le layoutmanager, c'est son rôle de positionner les composant. Ca permet de suivre proprement le système de layout de swing.

  8. #8
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Re,

    Excuse moi, mais j'ai du mal à visualiser ; donc, un peu de code (raccourci) :

    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
     
    public class jpCreation extends JPanel
    {
         public jpCreation()
        {
              super();
     
    	  this.setLayout(null);
     
    	  JButton monJButton=new JButton();
    	  monJButton.setBounds(186,80,53,53);
     
             this.add(monJButton);
        }
     
    }
    Du coup, ça donnerait quoi ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class jpCreation extends JPanel
    {
         public jpCreation()
        {
              super();
     
    	  this.setLayout(new MonLayoutAMoi());
    	  JButton monJButton=new JButton();
             this.add(monJButton, new MonLayoutConstraint(186,80,53,53));
        }
     
    }
    Note que le springlayout permet aussi de positionner un peu comme on veut les composants

  10. #10
    Membre régulier Avatar de Paniez
    Homme Profil pro
    Communication & Webservices
    Inscrit en
    Janvier 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Communication & Webservices
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 186
    Points : 107
    Points
    107
    Par défaut
    Re,

    Je comprends du coup où tu veux en venir, mais cela implique que je fasse mon propre layout manager, et là ... mis à part le site de sun, y-a-t-il un site qui explique comment faire son propre layout ?

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    t'as juste à implémenter l'interface LayoutManager2. Elle n'est pas bien compliquée à lire.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Le nullLayout pose-t-il vraiment problème si l'on sait que notre application fonctionnera toujours en 1024x768 et ne pourra jamais être redimmensionnée? (je ne comprends d'ailleurs pas la différence avec le
    this.add(monJButton, new MonLayoutConstraint(186,80,53,53));
    ) puisque dans les 2 cas les elements sont placées grace aux coordonnées) A quel niveau le nullLayout pose-t-il problème par rapport à l'autre solution apportée?

    D'autre part j'ai essayé de faire epasser le Layout en flow mais le problème persiste, le JScrollpane est toujours aussi long à afficher au lancement de la fenêtre d'application (avec le code 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    public class SuggestionsPanel extends javax.swing.JPanel {
     
        public SuggestionsPanel() {
            initComponents();
     
        }
     
        private void initComponents() {
     
            jScrollPane1 = new javax.swing.JScrollPane();
            jPanel1 = new javax.swing.JPanel();
            jLabel1 = new javax.swing.JLabel();
            jScrollBar1 = new javax.swing.JScrollBar();
     
            jScrollPane1.setVerticalScrollBar(jScrollBar1);
     
            jPanel1.setBackground(new java.awt.Color(255, 51, 0));
            jPanel1.setPreferredSize(new java.awt.Dimension(400, 400));
     
            jLabel1.setText("jLabel1");
            jPanel1.add(jLabel1);
     
            jScrollPane1.setViewportView(jPanel1);
     
            add(jScrollPane1);
            add(jScrollBar1);
        }
     
        private javax.swing.JLabel jLabel1;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JScrollBar jScrollBar1;
        private javax.swing.JScrollPane jScrollPane1;
     
    }
    Le layout joue donc peut etre un peu sur le temps d'affichage mais pour un code aussi simple je ne comprends pas pourquoi les éléments n'apparaissent pas immédiatement...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bon pour ton code. Le truc c'est que je JScrollPane est bien présent mais il s'adapte à la taille du panel contenu.

    Donc faut lui donner un preferredSize.

    De plus je ne vois pas vraiment à quoi sert la JScrollbar que tu ajoutes. Le JScrollPane possède déjà cette ScrollBar.

    Explique nous à quoi sert l'application et on te sortira une façon correcte d'utiliser les layouts et le dessin sur composant pour y parvenir.

    Enfin pour ton problème de lenteur, le code que tu donne marche sans problème chez moi.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Merci Sinok,

    le code que j'ai posté est simplement un exemple, mon JScrollPane dans ma vraie application sert à afficher les résultats d'une requête sur une BDD.
    Je vais chercher tous les "pseudos" dans la base de données et je les affiche les uns en dessous des autres pour faire simple. J'ai du rajouter une scrollbar car je veux permettre le glissement dans la fenetre quand on reste clické à l'intérieur du JScrollPane et que l'on bouge sa souris vers le haut ou vers le bas. Dans ce cas la je n'ai pas réussi à me servir de la JScrollBar du JScrollPane, il m'a fallu en créer une autre et lui attribuer.

    Je ne suis pas très clair mais bref la n'est pas le problème. Je pensais que c'était à cause de ma requête dans la base de données que je JScrollPane était long à s'afficher et je m'apperçois qu'il met du temps à s'afficher même quand il n'y a pas de requete et que j'utilise uin flowLayout... bizarre pour un code aussi simple. Quand je dis long.. c'est environ une demie seconde.. mais on a quand meme bien le temps de s'apercevoir qu'il n'apparait pas tout de suite. Tous les autres éléments de la page apparaissent immédiatement.

    J'ai essayé au début de réaliser mon application avec des Layout autres que null mais vraiment je trouve que ça complique la tâche.. sachant pertinament que mon application sera utilisée sur des écrans tactiles de configuration 1024x768.. donc je ne pense pas que le nullLayout soit réellement un problème (mais je peux me tromper, je débute en Java)

    Ce qui me surprend c'est que tu me dit que toi le JScrollPane s'affiche tout de suite? Vraiment tout de suite ?

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le null layout dans un JPanel utilisé par un scrollpane, son plus gros problème, c'est qu'il ne donne pas de taille au JPanel. Ainsi, lorsque le JScrollPane essaiera de dimensionne le JPanel, il finira avec un JPanel de taill null, ce qui posera des problème pour le défilement. L'avantage de créer un "absolute layout" plutot qu'un nulllayout, c'est que tu peux gérer ainsi correctement toutes les taille,en respectant ce à quoi s'attendent tous les composant swing. Peu importe que ce layout soit en taille fixé, ce qui importe c'est qu'il est là et qu'on peux y faire appel. Avec un null layout, t'as pas mal de composant swing qui vont passer dans des codes particuliers. Et puis, imagine que demain ton clent te demande aussi une version pour 1280x1024 ou 800x600. T'aura juste à changer ton layout pour qu'il prennent ca en compte.

    Pour ton problème de lenteur, si le scrollpane est lent à aficher, c'est généralement que le JPanel qui se trouve dedans est long à se dessiner. Car le JScrollPane ne fait rien de bien énorme comme boulot, il se contente de déléguer les méthode paint() au JPanel après avoir pris soins de changer le ClipRect pour prendre en compte le défillement. Donc si il est lent, c'est probablement que le JPanel ou un de ses composant à un code d'affichage lent.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup Tchize, je ferai de nouveaux essais plus tard pour déterminer la cause de mon problème. Si je trouve vous serez mis au courant.

    Je vais essayer d'éviter les nullLayout à partir de maintenant...

Discussions similaires

  1. [JScrollPane] n'affiche pas toute ma JList dynamique
    Par Strab dans le forum Composants
    Réponses: 4
    Dernier message: 01/07/2008, 16h57
  2. Je sais pas pourquoi ça m'affiche que la racine de Tree
    Par groupe dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 02/06/2008, 14h01
  3. Réponses: 9
    Dernier message: 15/02/2007, 13h57
  4. [JScrollPane,JTable]Afficher un endroit de la JTable
    Par warwink dans le forum Composants
    Réponses: 1
    Dernier message: 28/12/2006, 04h00
  5. Réponses: 3
    Dernier message: 03/10/2006, 19h33

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