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 :

Defilement au passage de la souris avec jScrollPane..


Sujet :

Composants Java

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut Defilement au passage de la souris avec jScrollPane..
    J'ai une fenetre divisee en trois partie. 2 bandes, une en haut et une en bas, et le contenu de la fenetre au milieu. La partie du milieu est un jscrollpane qui marche impeccablement mais je voudrais que quand l'utilisateur fasse passer la souris (meme sans cliquer) sur la bande du haut, la barre de defilement remonte, et quand il passe la souris sur la bande du bas la barre de defilement descende.

    ------------------------------------------------------------------------
    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    ------------------------------------------------------------------------





    CONTENU A FAIRE DEFILER VERTICALEMENT






    -------------------------------------------------------------------------
    |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    -------------------------------------------------------------------------

    Comme sur le shema ci dessus les bandes en haut et en bas (qui sont des jpanels) prennent toute la largeur de la fenetre. Avez vous une idée de comment faire ça ?

    downPanelMouseEntered est mon jPanel de la bande du bas.

    Pour l'instant je suis parti sur quelque chose comme :

    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 downPanelMouseEntered(java.awt.event.MouseEvent evt) {     
    while(scroll == 1){                                  
    try{
    jScrollPane.getVerticalScrollBar().setValue(jScrollPane.getVerticalScrollBar().getValue()+1);}
    Thread.currentThread().sleep(100);
    }catch(InterruptedException ie){}
    }
    }
     
     
     
    private void downPanelMouseExited(java.awt.event.MouseEvent evt) {                                      
            scroll = 0;
        }
    Le sleep est pour éviter que la barre de defilement descende trop vite tout simplement.

    Bien sur ca ne marche pas pour plusieurs raisons, le jScrollPane.getVerticalScrollBar().setValue ne marche pas et me me met des erreurs quand je lance passe le curseur de la souris sur la bande du bas. Et puis il y a un probleme de Thread je pense avec le while(scroll == 1) qui monopolise le thread et ne permet pas de sortir de la boucle..
    Avez vous des idées pour faire ce que je voudrais faire?

  2. #2
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    c'est bon je viens de resoudre le probleme moi meme

    J'ai fait :

    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
       private void downPanelMouseEntered(java.awt.event.MouseEvent evt) {                                       
            scroll = 1;
            down = new Thread(new ScrollBarDown(), "down");
            down.start() ;
        }                                      
     
        private void downPanelMouseExited(java.awt.event.MouseEvent evt) {                                      
            scroll = 0;
        }                                     
     
        private void upPanelMouseEntered(java.awt.event.MouseEvent evt) {
            scroll = 1;
            up = new Thread(new ScrollBarUp(), "up");
            up.start() ;
        }
     
        private void upPanelMouseExited(java.awt.event.MouseEvent evt) {
            scroll = 0;
        }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class ScrollBarUp implements Runnable{
     
        public void run() {
            while (ConsultProfilesPanel.scroll == 1 && ConsultProfilesPanel.jscroll.getValue()>0) {
                try{
                    ConsultProfilesPanel.jscroll.setValue(ConsultProfilesPanel.jscroll.getValue()-1);
                    Thread.currentThread().sleep(20);
                }
                catch(InterruptedException ie){}
            }
        }
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ScrollBarDown implements Runnable {
     
            public void run() {
            while (ConsultProfilesPanel.scroll == 1) {
                try{
                    ConsultProfilesPanel.jscroll.setValue(ConsultProfilesPanel.jscroll.getValue()+1);
                    System.out.println(ConsultProfilesPanel.jscroll.getValue());
                    Thread.currentThread().sleep(20);
                }
                catch(InterruptedException ie){}
            }
        }
     
    }
    Ca marche du tonerre !

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bonjour, essentiellement le Thread.sleep est une mauvaise pratique dans tout code Swing. En effet il bloque toute les opérations de dessin qui peuvent avoir lieu dans l'Event Dispatch Thread (le thread gérant toutes les opérations AWT/Swing).

    Je te conseille plutôt de passer par un timer Swing qui se déclenche toutes les X millisecondes à partir du moment ou tu es sur la zone qui fait bouger la scrollbar.
    Il suffit de lancer un start du timer au moment ou la souris entre dans la zone et de lancer un stop au moment ou la souris en sort. Ce sera amplement plus propre comme façon de faire.

  4. #4
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Merci Sinok pour ton conseil, cependant je ne sais pas trop comment faire ça.. aurais tu un exemple de code avec un timer?

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bon je viens de re regarder ton code et en effet il viole bien le concept d'EDT.Mais toutefois ce n'est pas le Thread.sleep qui pose problème. En effet ces sleep sont appelés dans des threads séparés de l'EDT, pas de problème de ce coté là. Le problème vient du fait que tu modifies des composants swing en dehors de l'EDT ce qui peut amener pas mal de problème de synchronisation et ainsi de suite sachant que Swing n'est pas thread safe.

    Pour modifier un composant de ton interface depuis un thread hors EDT (c'est à dire tout thread déclenché dans ton code, il faut encapsulé l'appel modifiant le composant par un SwingUtilities.invokeLater

    Toutefois, comparé à la solution du timer c'est un peu lourdingue.

    Voici une solution faite à base de Timer swing:

    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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.Timer;
     
     
    public class TimerTest extends JFrame{
     
        private JScrollPane p;
        private Timer timerUp;
        private Timer timerDown;
        private JPanel down;
        private JPanel up;
     
        public TimerTest() {
            p = new JScrollPane();
            timerUp = new Timer(20, new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent e) {
                    p.getVerticalScrollBar().setValue(p.getVerticalScrollBar().getValue()+1);
                }
     
            });
     
     
            timerDown = new Timer(20, new ActionListener() {
     
                @Override
                public void actionPerformed(ActionEvent e) {
                    p.getVerticalScrollBar().setValue(p.getVerticalScrollBar().getValue()-1);
                }
     
            });
     
            up = new JPanel();
            up.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    timerUp.start();
                }
     
                @Override
                public void mouseExited(MouseEvent e) {
                    timerUp.stop();
                }
            });
     
     
            down = new JPanel();
            down.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    timerDown.start();
                }
     
                @Override
                public void mouseExited(MouseEvent e) {
                    timerDown.stop();
                }
            });
        }    
    }
    Propre, pas de threads et d'appel à invokeLater dans tous les sens et très compréhensible.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/09/2010, 12h17
  2. Réponses: 2
    Dernier message: 31/08/2009, 12h00
  3. Réponses: 2
    Dernier message: 06/05/2009, 10h12
  4. Petit son avec passage de la sourie.
    Par alarue.com dans le forum Flash
    Réponses: 3
    Dernier message: 27/05/2008, 22h24
  5. Réponses: 32
    Dernier message: 19/11/2005, 20h26

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