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 :

[JScrollBar] gérer la position lors d'un défilement


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut [JScrollBar] gérer la position lors d'un défilement
    Bonjour,

    Je souhaite actuellement régler la position d'une JScrollBar en fonction de ce que fait l'utilisateur. La fenêtre contient un JScrollPane à l'intérieur duquel se trouve un JTextArea. Au cours du temps j'ajoute des String dans ce dernier.

    Je ne sais pas si c'est faisable, mais je voudrais que ma JScrollBar ait deux positions possibles :

    -Si elle est en bas de la fenêtre, elle "suit" le flux de String.
    -Sur toute autre position, elle se stoppe à cette position.




    Bien évidemment je ne veux pas qu'à un seul moment mon flux de String s'arrête




    Voici le code de mon Listener qui ne marche mais alors pas du tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public void adjustmentValueChanged(AdjustmentEvent e) {
     
                if (this.scrollBar.getMaximum() == this.scrollBar.getValue()) {
                    int index = this.frame.getFlow().getDocument().getLength();
                    this.scrollBar.setValue(index);
                } else {
                    this.scrollBar.setValue(this.scrollBar.getValue());
                }
        }

    Est-ce que quelqu'un aurait une idée ?


    Merci.

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Les JTextComponent ont une méthode pour faire cela :
    http://java.sun.com/javase/6/docs/ap...awt.Rectangle)

    Tu trouvera des explications et des exemples facilement avec google.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut
    Hum, je me suis peut-être mal exprimé.

    En fait pour l'instant j'affiche correctement toutes mes données.
    Seulement c'est la gestion de ma JScrollBar qui ne marche pas.



    Ou alors j'ai strictement rien compris à la méthode scrollRectToVisible(Rectangle aRect).

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Heu, c'est peut-être moi qui t'es mal compris

    elle se stoppe à cette position.
    Je crois si je ne m'abuse (peut-être ai-je tord), que c'est le comportement par défaut. Tu peut ajouter les String que tu veux (par du code, pas à la mano) le scroll reste à la même position.

    elle "suit" le flux de String.
    Alors scrollRectToVisible(Rectangle aRect) est ton amie ! Cela permet de faire "scroller" la composant pour que le Rectangle aRect soit visible.

    Sinon, j'ai vraiment pas compris ce que tu veux

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut
    Bon je reprends tout depuis le début, j'ai mal fait mon explication.

    J'ai une fenêtre à l'intérieur de laquelle se trouve un simple JTextArea. Ce dernier est alimenté irrégulièrement.
    Son Container est un JScrollPane me permettant de regarder tout mon flux de String.

    Tout ça marche


    Seulement, par défaut la JScrollBar se bloque en bas.
    J'aimerais pouvoir faire que si je touche à celle-ci (en remontant plus haut dans ma fenêtre), elle se bloque, et que je puisse ainsi lire mon String tranquillement. Bien entendu le flux continue pendant que je fais ma lecture.

    Par contre, je veux aussi l'effet inverse. Si je mets ma ScrollBar tout en bas de mon JTextArea, je veux qu'elle suive de nouveau le flux qui s'affiche.


    Est-ce plus clair ?

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    D'accord je comprends mieux !

    Et bien je crois qu'il suffit de donner le focus a ton JTextComponent pour qu'il "se fixe" a l'endroit où le caret se trouve.

    Lance cet exemple et tu verra qu'en mettant le curseur soit au début, il se fixe au début. Si tu met le curseur à la fin, il suivra la "progression" du TextArea.

    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
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.SwingUtilities;
     
    public class Test {
     
    	private final JTextArea text = new JTextArea();
    	private static int id = 0;
     
    	public static void main(String[] args) {
    		new Test();
    	}
     
    	public Test() {
    		JFrame f = new JFrame();
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JScrollPane sp = new JScrollPane(text);
     
    		f.add(sp);
     
    		f.pack();
    		f.setVisible(true);
     
    		Thread thread = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				while (id < 60) {
    					id++;
    					Runnable code = new Runnable() {
    						@Override
    						public void run() {
    							text.append("Texte " + id + "\n");
    						}
    					};
    					if (SwingUtilities.isEventDispatchThread()) {
    						code.run();
    					} else {
    						EventQueue.invokeLater(code);
    					}
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) { }
    				}
    			}
    		});
    		thread.start();
    	}
     
    }

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

Discussions similaires

  1. Gérer la position d’une figure
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 28/06/2009, 19h46
  2. Gérer les évènements lors d'un click sur les JButtons
    Par othman22222 dans le forum Composants
    Réponses: 1
    Dernier message: 22/12/2008, 17h08
  3. [BINDINGSOURCE] Perte de position lors du tri
    Par freud dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/12/2007, 12h55
  4. Position absolute, barre de défilement et IE6
    Par alveric dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 18/07/2007, 10h14
  5. [C#]Comment gérer le Firewall lors d'un déploiement ?
    Par bilb0t dans le forum Contribuez
    Réponses: 10
    Dernier message: 01/10/2006, 10h38

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