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 :

scrollRectToVisible et setViewPosition


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 98
    Points : 63
    Points
    63
    Par défaut scrollRectToVisible et setViewPosition
    Bonjour.

    J'airais aimé connaitre la différence (au niveau de leur utilité) entre les méthodes scrollRectToVisible et setViewPosition sur un objet JScrollPane.

    Je cherche à faire défiler automatiquement les contenu d'un JScrollPane: dans mon JScrollPane, une liste qui peut être suffisamment longue pour ne pas entrer entièrement dans ma fenêtre sans ascenseur. Ce que je cherche à faire c'est que, par exemple, quand on clique sur un élément du milieu de la liste, l'ascenseur vertical bouge puis se positionne automatiquement au milieu.

    J'ai donc essayé avec les deux méthodes suscitées, mais ça ne marche pas comme je le voudrais, surtout scrollRectToVisible avec laquelle je n'arrive même pas à modifier, de manière statique, la partie visible de la vue...

    D'autres précision sur demande.

    Merci par avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 80
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    Bonjour.

    J'airais aimé connaitre la différence (au niveau de leur utilité) entre les méthodes scrollRectToVisible et setViewPosition sur un objet JScrollPane.

    Je cherche à faire défiler automatiquement les contenu d'un JScrollPane: dans mon JScrollPane, une liste qui peut être suffisamment longue pour ne pas entrer entièrement dans ma fenêtre sans ascenseur. Ce que je cherche à faire c'est que, par exemple, quand on clique sur un élément du milieu de la liste, l'ascenseur vertical bouge puis se positionne automatiquement au milieu.

    J'ai donc essayé avec les deux méthodes suscitées, mais ça ne marche pas comme je le voudrais, surtout scrollRectToVisible avec laquelle je n'arrive même pas à modifier, de manière statique, la partie visible de la vue...

    D'autres précision sur demande.

    Merci par avance.
    Bonjour,

    Je suppose que ta liste est dans un champ texte (par exemple un JTextArea)

    Soient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JTextArea jta = new  JTextArea(5,30);
    JScrollPane jsp = new JScrollPane(...) ;
    Tu peux utiliser jsp.getVerticalScrollBar().setValue() (passer à setValue() l'ordonnée pixel où le VerticalScrollBar doit être centré)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jsp.getVerticalScrollBar().setValue(100)
    Dans l'exemple ci-dessous le Bouton place le VerticalScrollBar à l'ordonnée 100 (pixel)

    Pour ton pb tu peux calculer l'ordonnée avec
    un écouteur de click (MouseListener) sur le JTextArea
    et un calcul basé sur
    • jta.getCaretPosition() -> n° de caractère dans le JTextArea
    • le texte du JTextArea(n° ligne du caractère) -> par exemple, avec index des n° de caractère de début ligne
    • la hauteur des caractères de la police utilisée dans le JTextArea



    Par exemple (je te laisse le soin de définir la fonction f() de calcul de l'ordonnée selon contexte de ton programme) :

    Démo :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
    /**
     *
     * @author kick54
     */
    public class PanneauPrincipal extends JPanel {
     
        public PanneauPrincipal() {
            JTextArea jta = new  JTextArea(5,30);
            JScrollPane jsp = new JScrollPane(jta) ;
     
            jta.addMouseListener(new MouseListener() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Caret (character position) : " + jta.getCaretPosition()) ;
                    jsp.getVerticalScrollBar().setValue( f(jta) );
     
                }
     
                @Override
                public void mousePressed(MouseEvent e) { 
                    // nop 
                }
     
                @Override
                public void mouseReleased(MouseEvent e) {
                    // nop
                }
     
                @Override
                public void mouseEntered(MouseEvent e) {
                    // nop
                }
     
                @Override
                public void mouseExited(MouseEvent e) {
                    // nop
                }
            });
            initText(jta) ;
     
            JButton jb = new JButton("Jump");
            jb.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    jsp.getVerticalScrollBar().setValue(100);
    //                jsp.repaint();
                }
            });
            this.add(jsp) ;
            this.add(jb) ;
     
        }
     
     
        /**            
         * f() prend encompte la position curseur dans le texte, 
         *      puis calcule le numéro de ligne dans le text
         *      et la position pixel en fonction de la taille des caractères du textArea
         * 
         */
        private int f(JTextArea jta){
     
            int ordonnee = jta.getCaretPosition() ;
            /**
             * A compléter
             */
            return 110 ;
        }
     
        private void initText(JTextArea jta){
                    jta.setText("Bonjour.\n" 
                    + "J'airais aimé connaitre la différence (au niveau de leur utilité)"
                    + " entre les méthodes scrollRectToVisible et "
                    + "setViewPosition sur un objet JScrollPane.\n" +
                    "\n" +
                    "Je cherche à faire défiler automatiquement les contenu "
                    + "d'un JScrollPane: dans mon JScrollPane, une liste "
                    + "qui peut être suffisamment longue pour ne pas entrer "
                    + "entièrement dans ma fenêtre sans ascenseur. Ce que je "
                    + "cherche à faire c'est que, par exemple, quand on clique "
                    + "sur un élément du milieu de la liste, l'ascenseur vertical "
                    + "bouge puis se positionne automatiquement au milieu.\n" +
                    "\n" +
                    "J'ai donc essayé avec les deux méthodes suscitées, "
                    + "mais ça ne marche pas comme je le voudrais, surtout "
                    + "scrollRectToVisible avec laquelle je n'arrive même "
                    + "pas à modifier, de manière statique, la partie visible de la vue...\n" +
                    "\n" +
                    "D'autres précision sur demande.\n" +
                    "\n" +
                    "Merci par avance. "+ "J'airais aimé connaitre la différence (au niveau de leur utilité)"
                    + " entre les méthodes scrollRectToVisible et "
                    + "setViewPosition sur un objet JScrollPane.\n" +
                    "\n" +
                    "Je cherche à faire défiler automatiquement les contenu "
                    + "d'un JScrollPane: dans mon JScrollPane, une liste "
                    + "qui peut être suffisamment longue pour ne pas entrer "
                    + "entièrement dans ma fenêtre sans ascenseur. Ce que je "
                    + "cherche à faire c'est que, par exemple, quand on clique "
                    + "sur un élément du milieu de la liste, l'ascenseur vertical "
                    + "bouge puis se positionne automatiquement au milieu.\n" +
                    "\n" +
                    "J'ai donc essayé avec les deux méthodes suscitées, "
                    + "mais ça ne marche pas comme je le voudrais, surtout "
                    + "scrollRectToVisible avec laquelle je n'arrive même "
                    + "pas à modifier, de manière statique, la partie visible de la vue...\n" +
                    "\n" +
                    "D'autres précision sur demande.\n" +
                    "\n" +
                    "Merci par avance. "
            );
     
        }
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 98
    Points : 63
    Points
    63
    Par défaut
    Bonjour kick54.

    Merci pour ta réponse.

    Ma liste est une JList.
    J'arrive à trouver la position de l'élément sélectionné avec la méthode indexToLocation.

    Je crois que je me suis mal exprimé : j'arrive à placer l'ascenseur correctement là où je veux avec la méthode setViewPosition: quand je clique (sélectionne) sur un élément de ma liste, cet élément vient bien se placer au milieu de ma vue; l'ascenseur se positionne, en conséquence, correctement.

    Mais deux choses m'interrogent:
    - je ne voudrais pas seulement que quand je clique sur cet élément il se place au centre de la vue, je voudrais aussi voir la vue (donc ma liste) défiler de l'ancienne position à la nouvelle; en gros il faudrait que ma vue soit "animée".
    - j'ai voulu faire la même chose avec la méthode scrollRectToVisisble au lieu de setViewPosition, sans aucun résultat... Avec scrollRectToVisisble, aucun recentrage. Donc je me pose des questions sur l'utilité et le fonctionnement de cette méthode.

    J'ai aussi essayé avec JScrollBar.setValue(), sans succès...

    Voilà.
    J'essaie d'être clair, mais ce n'est pas simple.

    Merci encore.

  4. #4
    Membre habitué
    Homme Profil pro
    Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 80
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    Bonjour kick54.

    Merci pour ta réponse.

    Ma liste est une JList.
    J'arrive à trouver la position de l'élément sélectionné avec la méthode indexToLocation.

    Je crois que je me suis mal exprimé : j'arrive à placer l'ascenseur correctement là où je veux avec la méthode setViewPosition: quand je clique (sélectionne) sur un élément de ma liste, cet élément vient bien se placer au milieu de ma vue; l'ascenseur se positionne, en conséquence, correctement.

    Mais deux choses m'interrogent:
    - je ne voudrais pas seulement que quand je clique sur cet élément il se place au centre de la vue, je voudrais aussi voir la vue (donc ma liste) défiler de l'ancienne position à la nouvelle; en gros il faudrait que ma vue soit "animée".
    - j'ai voulu faire la même chose avec la méthode scrollRectToVisisble au lieu de setViewPosition, sans aucun résultat... Avec scrollRectToVisisble, aucun recentrage. Donc je me pose des questions sur l'utilité et le fonctionnement de cette méthode.

    J'ai aussi essayé avec JScrollBar.setValue(), sans succès...

    Voilà.
    J'essaie d'être clair, mais ce n'est pas simple.

    Merci encore.
    Bonjour,

    Pour l'animation, je pense qu'il faut que tu mettes en oeuvre un Timer Swing (javax.swing.Timer) associer à un gestionnaire d'événements dont l'action ordonnera pas à pas l'avancement du scrolling dans la JList.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 98
    Points : 63
    Points
    63
    Par défaut
    Bonjour kick54.

    Je viens d'essayer avec un Timer. Ca marche presque à merveille : ça marche très bien mais ce n'est pas très fluide.

    Ce que j'ai fait c'est donc un Timer qui appelle à intervalles réguliers la méthode setViewPosition() sur mon JViewPort. Apparemment cette méthode est assez chronophage donc je suis obligé de bouger ma liste de 20 en 20 unités pour accélérer le mouvement.
    Sur le Timer, j'ai mis un delai de 1 ms.

    Peut-être que mon diagnostic n'est pas le bon; il part du principe que les coordonnées que l'on passe à setViewPosition() s'expriment en pixels.

    J'attends vos retours.

    Merci.

  6. #6
    Membre habitué
    Homme Profil pro
    Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 80
    Points : 145
    Points
    145
    Par défaut
    Citation Envoyé par amauryxiv Voir le message
    Bonjour kick54.

    Je viens d'essayer avec un Timer. Ca marche presque à merveille : ça marche très bien mais ce n'est pas très fluide.

    Ce que j'ai fait c'est donc un Timer qui appelle à intervalles réguliers la méthode setViewPosition() sur mon JViewPort. Apparemment cette méthode est assez chronophage donc je suis obligé de bouger ma liste de 20 en 20 unités pour accélérer le mouvement.
    Sur le Timer, j'ai mis un delai de 1 ms.

    Peut-être que mon diagnostic n'est pas le bon; il part du principe que les coordonnées que l'on passe à setViewPosition() s'expriment en pixels.

    J'attends vos retours.

    Merci.
    Bonjour,
    Peux-tu envoyer une copie de ton code ?

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2004
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 98
    Points : 63
    Points
    63
    Par défaut
    Un extrait de mon code:

    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
     
    class MaFenetre
        private JScrollPane scrollPane = new JScrollPane(maListe);
        private Timer timerMouvementAscenseur;
     
        private class DecalageListener implements ActionListener {
    	private Timer timer;
    	private int oldPosition;
    	private int newPosition;
    	private int intermediatePosition;
     
    	public DecalageListener(Timer timer, int oldPosition, int newPosition) {
    		this.timer = timer;
    		this.oldPosition = oldPosition;
    		this.newPosition = newPosition;
    		this.intermediatePosition = this.oldPosition;
    	}
     
    	public void actionPerformed(ActionEvent ae) {
    		if(this.newPosition > this.oldPosition) {
    			this.intermediatePosition += 15;
    			if(this.intermediatePosition > this.newPosition) {
    				MaFenetre.this.scrollPane.getViewport().setViewPosition(new Point(0, this.newPosition));
    				this.timer.stop();
    				return;
    			}
    			MaFenetre.this.scrollPane.getViewport().setViewPosition(new Point(0, this.intermediatePosition));
    		}
    		else if(this.newPosition < this.oldPosition) {
    			this.intermediatePosition -= 15;
    			if(this.intermediatePosition < this.newPosition) {
    				MaFenetre.this.scrollPane.getViewport().setViewPosition(new Point(0, this.newPosition));
    				this.timer.stop();
    				return;
    			}
    			MaFenetre.this.scrollPane.getViewport().setViewPosition(new Point(0, this.intermediatePosition));
    		}
    	}
        } 
     
     
        public void decalerVueJusquePosition(int newPosition) {
        	int oldPosition = this.scrollPane.getViewport().getViewPosition().y;
     
    	this.timerMouvementAscenseur.stop();
     
    	this.timerMouvementAscenseur = new Timer(10, null);
     
        	DecalageListener decalage = new DecalageListener(this.timerMouvementAscenseur, oldPosition, newPosition);
        	this.timerMouvementAscenseur.addActionListener(decalage);
        	this.timerMouvementAscenseur.start();
        }

    Voilà...
    La méthode qui opère le décalage "animé" est bien sûr decalerVueJusquePosition(...)
    Plus de précisions ou d'explications à la demenade.

    Comme vous l'aurez noté, le délai du Timer et l'unité du décalage de ma vue ne sont pas ceux stipulés dans mon dernier message. C'est parce que je teste plusieurs combinaisons pour trouver la meilleure...

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