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 :

JTextArea et Scrolling


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut JTextArea et Scrolling
    Bonjour a tous.
    J'ai créé un JTextArea, contenu dans un JScrollPane...
    Comme mon JTextArea fait office de "console" (en gros je redirige le flux de la console vers ma fenetre.) je souhaiterais que l'ascenseur vertical soit toujours au plus bas.
    (En gros, faire comme sur une console unix, voir toujours la dernière ligne...)

    J'ai essayé avec cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void scroll(){
           try {
              jta.scrollRectToVisible(jta.modelToView(
                          jta.getDocument().getLength()));
            } 
           catch (Exception err) {
               err.printStackTrace();
            }
       }
    Mais ca ne fonctionne pas exactement comme je le souhaite, en fait, il reste toujours trois quetres lignes cachées ... le scroll n'est donc pas en bas...
    Si quelqu'un a une idée, je suis preneur!
    Merci d'avance
    La naissance est le seul fruit du hasard

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


    Est-ce que tout le code qui utilise ton JTextArea et ton JScrollPane est bien dans l'EDT ?

    Sinon un petit coups de SwingUtilities.invokeLater() devrait faire l'affaire...

    a++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Je vais probablement passer pour un noobs, mais qu'est ce que tu appelle l'EDT?
    Merci
    La naissance est le seul fruit du hasard

  4. #4
    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
    Citation Envoyé par tomca
    Je vais probablement passer pour un noobs, mais qu'est ce que tu appelle l'EDT?
    EDT = Event Dispatch Thread


    C'est un thread qui est créé automatiquement lorsque tu crées une interface graphique, et qui s'occupe de tout ce qui touche de près ou de loin les interfaces graphiques (affichage des composants, destions des exceptions, etc...).



    Et toutes les modifications sur tes composants DOIVENT obligatoirement être effectuées dans ce thread, sinon tu peux avoir toutes sortes de problèmes... Cela permet d'ordonner correctement les tâches dans un environemment multi-threads puisque tout les traitements sont centralisé sur un même thread...

    Pour plus d'info tu peux lire ceci (en anglais) :
    http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html



    En pratique tu as trois méthodes à connaitre :

    • SwingUtilities.isEventDispatchThread() qui t'indique si le code courant est exécuté dans l'EDT ou pas (par exemple toutes les méthodes des listeners Swing sont exécutées dans l'EDT).
    • SwingUtilities.invokeLater() qui te permet d'envoyer du code à exécuter sur le thread de l'EDT (a la fin de la pile des traitements). La méthode rend la main tout de suite sans attendre que le code soit exécuté... Par exemple dans ton cas pour déplacer le jscrollpane (il faut faire le append() également dans l'EDT) :
      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 appendAndScroll(final String texte) {
       
             SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  m_textArea.append(texte);
                  try {
                      m_textArea.scrollRectToVisible(m_textArea.modelToView(
                                  m_textArea.getDocument().getLength()));
                   } catch (javax.swing.text.BadLocationException err) {
                      err.printStackTrace();
                   }
              } 
             });
       
         }
    • SwingUtilities.html#invokeAndWait]SwingUtilities.invokeAndWait() permet la même chose mais attendra que le code soit exécuté pour rendre la main (utile si tu dois récupérer un ou plusieurs éléments en résultat).



    a++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Merci AdiGuba...c'était tout a fait ca!
    En fait j'appellais ma fonction de scroll() depuis un handler, handler qui tournais sur un autre thread...j'ai utilisé invokeLater()...et ca fonctionne exactement comme je le souhaite!
    Merci encore!
    La naissance est le seul fruit du hasard

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

Discussions similaires

  1. [JTextArea dans GridBagLayout] pas de scroll
    Par L. Sierra dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 10/01/2008, 23h49
  2. Scroll sur une JTextArea
    Par titus55 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/08/2007, 09h05
  3. JTextArea et scroll, toujours voir la dernière ligne ajouté
    Par nicofromChina dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/01/2007, 10h04
  4. Réponses: 2
    Dernier message: 12/01/2007, 13h45
  5. [Débutant] Scrolls dans JTextArea
    Par k-reen dans le forum Composants
    Réponses: 2
    Dernier message: 30/06/2004, 16h14

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