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 :

Problème de positionnement de JScrollBar dans une JScrollPane


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Problème de positionnement de JScrollBar dans une JScrollPane
    Bonsoir

    Après de multiple recherche sur le net et après avoir recherché une réponse dans les discussions ouvertes, je n'ai encore trouvé aucun problème similaire au mien.

    Dans le cadre d'une application client-serveur de type SIRC (le client étant bien entendu avec interface graphique), je crée des JList, JTextField, JScrollPane, JLabel et JButton.

    La fenêtre principale de mon client est une JList et non une JTextArea.
    Cette JList est associée à une JScrollPane pour ajuster le contenu de la JList avec des JScrollBar.

    Elle a été déclaré comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                     // chatArea est le nom de la JList
                    chatArea = new JList();
                    [...]
                    // maConvers est un Vecteur de String
    		chatArea = new JList(maConvers);
     
                    // chatScroll est la JScrollPane associée à ma chatArea
    		chatScroll = new JScrollPane(chatArea);
    		chatScroll.setLocation(170, 205);
    		chatScroll.setSize(545, 400);
    		this.getContentPane().add(chatScroll);
    Pour tester le bon fonctionnement de la JList, j'ai utilisé un JTextField et un JButton, qui ajoute d'abord le contenu du JTextField dans le vecteur maConvers avant de mettre à jour la JList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public void actionPerformed(ActionEvent e)
    	{
        	Object source = e.getSource();
    		if (source == this.sendButton)
    		{
    			maConvers.addElement(this.sendField.getText() + "\n");
    			chatArea.setListData(maConvers);
     chatScroll.getVerticalScrollBar().setValue(chatScroll.getVerticalScrollBar().getMaximum());
    		}
    	}
    Comme dans tout chat, je souhaite que, lorsque ma JList est plus grande que la dimension allouée (si je peux m'exprimer ainsi), j'ai ma JScrollBar qui se colle à la fin de ma JList.

    J'ai "implémenté" cette solution en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			chatScroll.getVerticalScrollBar().setValue(chatScroll.getVerticalScrollBar().getMaximum());
    Mon problème est le suivant : lorsque j'envoie des messages, après avoir dépassé la taille de ma JList, ma méthode employée ci-dessus ne me positionne pas au dernier élément de ma JList mais à l'avant dernier, ce que je ne comprends pas

    J'ai essayé une autre méthode, qui me fait exactement la même chose.

    Pourriez vous m'expliquer mon erreur et m'aider à résoudre ce problème gênant?

    Merci à vous

    Dans le fichier ci-joint, test3 a été envoyé mais la JScrollBar reste à "l'avant dernière position".
    Images attachées Images attachées  

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Toujours aucune idée??

    J'ai essayé diverses méthodes mais rien alors je me demande toujours d'où vient mon erreur si quelqu'un à son idée,...

  3. #3
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    En général j'utilise plutôt la méthode scrollRectToVisible quand je souhaite rendre une partie de mon ViewPort visible.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    moi j'utilise une JTextArea et non une Jlist, avec une jtextarea il suffit de faire :
    jTextArea1.setCaretPosition(jTextArea1.getDocument().getLength());

    sinon toi essai de rajouter 1 constante a ta valeur : setValue(...+20);

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Gandalf2008 Voir le message
    Mon problème est le suivant : lorsque j'envoie des messages, après avoir dépassé la taille de ma JList, ma méthode employée ci-dessus ne me positionne pas au dernier élément de ma JList mais à l'avant dernier, ce que je ne comprends pas
    C'est normal que cela ne fonctionne pas : la taille de ta scrollbar n'a pas encore été mise à jour.

    Les interfaces graphiques fonctionnent par evénement, qui sont traiter en boucle par l'EDT. Donc lorsques tu modifies les données de ta list, cela modifie sa taille et cela génèrera donc un évenement qui en avertira les autres composants qui ont besoin de cette information (le JScrollPane en l'occurence).

    Le problème vient du fait que l'évenement est empilé dans l'EDT, et sera donc exécuté après ta méthode actionPerformed(). Donc lorsque tu récupères la taille maximum de ta scrollbar tu as une valeur incorrecte car la modif de taille n'a pas encore été prise en compte.


    Donc tu as deux solutions :
    • Utiliser SwingUtilities.invokeLater() pour empiler la mise à jour de la jscrollbar à la fin des traitements en cours :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      	SwingUtilities.invokeLater(new Runnable() {
      		public void run() {
      			chatScroll.getVerticalScrollBar().setValue(
      					chatScroll.getVerticalScrollBar().getMaximum()
      				);
      		}
      	});
    • Mais la meilleure solution à mon avis serait bel et bien d'utiliser scrollRectToVisible() qui va générer lebon evènement
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      	int size = chatArea.getModel().getSize() - 1;
      	chatArea.scrollRectToVisible(chatArea.getCellBounds(size, size));




    a++

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par adiGuba
    [...][*] Mais la meilleure solution à mon avis serait bel et bien d'utiliser scrollRectToVisible() qui va générer lebon evènement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	int size = chatArea.getModel().getSize() - 1;
    	chatArea.scrollRectToVisible(chatArea.getCellBounds(size, size));
    [/list]
    a++
    Bonjour.

    Je viens d'effectuer cette manipulation et elle fonctionne parfaitement.

    Je te remercie.

    J'essayerai aussi de tester les autres instructions des autres personnes m'ayant répondu.

    Je tiens aussi à te remercier de m'avoir expliqué le principe de fonctionnement complet

    J'espère que ce post aidera d'autres personnes

    A++

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

Discussions similaires

  1. [XL-2010] Problème de positionnement de graphique dans une feuille - VBA
    Par raphdes dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/08/2014, 12h12
  2. Positionner des cellules dans une page
    Par BBe8127 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/10/2005, 10h25
  3. [CSS]problème centrage texte de bouton dans une boîte
    Par Aurelius dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 06/09/2005, 16h01
  4. Problème d'utilisation de fonction dans une popup
    Par Pymm dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/09/2005, 15h00
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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