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 :

JScrollPane et partie visible.


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 JScrollPane et partie visible.
    Bonjour a tous.
    J'ai un JTextArea, contenu dans un JScrollPane.
    Le texte contenu dans le JTextArea est régulièrement mis a jour (fonction automatique de colorisation de texte)
    Seulement, si je descend dans mon texte avec ma ScrollBar, et qu'un rafraichissement automatique a lieu, je perd "ma partie visible"...en gros il me remonte ma scrollBar au maximum...

    Je voudrais savoir quelle méthode utiliser pour réussir a mémoriser la partie 'visible' de mon JTextArea, de sorte qu'une fois la mise a jour terminée, je puisse revenir a mon affichage initial.

    J'ai essayé avec pas mal de chose....sans succès

    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
     
    public void colorize (){
           System.out.println("colorize");
           //Sauvegarde d'une éventuelle sélection
           int sel_start = jta.getSelectionStart();
           int sel_stop = jta.getSelectionEnd();
           //Sauvegarde de la position du mon curseur de souris
           int mouse_position = jta.getCaretPosition();
           //Sauvegarde de ma zone visible...Mais ca fonctionne pas comme cela
           Rectangle rect = jta.getVisibleRect(); 
           /**
           *    Gestion de ma colorisation. En gros, je vire le texte de mon composant, et je le    
           *     regénère
           **/
           jta.setText("");
           StyledDocument doc = jta.getStyledDocument();
           addStyletoDoc(doc);
           //Je rempli a nouveau mon composant avec des méthodes de ce style
           //doc.insertString(doc.getLength(), (String)str.get(i), doc.getStyle("motcle"));
            .....
          //Position de ma souris
           jta.setCaretPosition(mouse_position);
           jta.setDocument(doc);
           //Récupération de ma sélection
           jta.setSelectionStart(sel_start);
           jta.setSelectionEnd(sel_stop);
           //En principe affichage de mon 'rectangle'....mais ca ne fonctionne pas
           jta.scrollRectToVisible(rect);
           jta.repaint();
       }
    Voila, si quelqu'un a une idée....

    Ps...petite question subsidiaire...quelqu'un connait t'il le moyen de changer le nombre d'espaces utilisés par la tabulation...car je trouve ceux par défaut dans java beaucoup trop grand.

    Merci d'avance

  2. #2
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    tu peux essayer ca (non testee):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JViewport view=tonJscroll.getViewport();
    //ton traitement
    tonJscroll.setViewport(view);

  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
    Merci pour ta réponse...
    Cependant j'ai essayé...mais dès que ma méthode colorize() est appellée, ben ma scrollBar remonte au maximum (alors que je la descend au maximum...)

    D'autres idées?

  4. #4
    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
    Bonjour,
    La position à sauvegarder est plutot celle des JScrollBar que celle du JTextArea (avec JScrollPane.getHorizontal/VerticalScrollBar().get/setValue()).

  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
    Bon est bien, j'ai quasiment tout tester...mais rien n'y fais...
    En fait, j'ai capté que le Scroll se met automatiquement de manière à avoir le curseur de souris a l'écran, donc si le curseur n'est pas visible, dès qu'un repaint a lieu, ou autre, le ScrollPane déplace ses barres de scroll de manière a afficher le curseur...

    Ma solution:

    Tout d'abord empêcher le scroll automatique...
    Pour cela, c'est assez simple:

    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
     
    public class MyScrollTextPane extends JPanel implements KeyListener{
    boolean autoscroll=false;
     
        public MyScrollTextPane(){
            super();
     
            jta = new JTextPane() { 
                public void scrollRectToVisible(Rectangle aRect) {
                    if(autoscroll){
                        super.scrollRectToVisible(aRect);
                    }
                }
            };
        }
    Ainsi je surcharge la méthode scrollRectToVisible, en l'empêchant de se lancer.

    Seulement, avec cette astuce, si mon caret n'est pas visible, et qu'on le déplace a l'aide du clavier (touches flèches)...et bien le caret se déplace, mais il n'y a plus de scroll automatique...donc en gros ca se déplace dans la partie non visible du texte...
    Pas cool, donc pour régler cette conséquence, il suffit de faire ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jta.addKeyListener(this);
    Et de surcharger les méthodes du KeyListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       public void keyPressed(KeyEvent e) {
           autoscroll=true;
       }
     
       public void keyReleased(KeyEvent e) {
           autoscroll=false;
       }
     
       public void keyTyped(KeyEvent e) {}
    Et voila, ca fonctionne super bien!
    Merci a tous toutefois pour votre aide!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/05/2011, 09h54
  2. Réponses: 2
    Dernier message: 26/09/2009, 20h23
  3. aligner à gauche, avec partie visible à droite
    Par potili2 dans le forum Débuter
    Réponses: 1
    Dernier message: 23/04/2009, 19h00
  4. Réponses: 1
    Dernier message: 17/05/2007, 10h54
  5. JScrollPane : scroll que sur une partie du tableau
    Par mickael.guilbert dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 21/08/2006, 08h53

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