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, Textfield et la scrollbar


Sujet :

AWT/Swing Java

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut JscrollPane, Textfield et la scrollbar
    Bonjour à tous.

    Je n'arrive pas à déplacer la scrollbar d'un JScrollPane et après quelques heures de recherche, je m'en remets à vous.

    Voilà le problème:

    J'ai un petit formulaire composé jlabel + jtextfield qui est contenu dans un JPanel.
    Ce JPanel n'a pas de layout, les composants sont donc placés en absolu.
    Ce JPanel est contenu dans un JScrollPane pour bénéficier de la barre de défilement.

    La barre de défilement fonctionne très bien.

    Les Textfield sont les uns en dessous des autres. En appuyant sur une flèche vers le bas (un JButton), le focus passe au suivant et si j'appuie sur la flèche du haut, il remonte.

    L'ennui c'est que du coup, le focus passe bien au suivant mais la barre ne suit pas et très vite, le focus se retrouve en dehors de la zone visible.

    J'ai bien lu que pour des JTextArea on pouvait faire des setCaretPosition() sauf que dans mon cas, je ne peux pas, forcément.


    Merci de votre aide.

    Dest.

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Salut,

    J'ai eu besoin pour une applic de scroller automatiquement selon le composant en focus.

    J'te file ma solution toute faite.

    Cette ligne au lancement de ton applic pour activer le listener de focus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FocusUtils.activateFocusOwnerListener(true);
    Cette classe d'utilitaire pour gérer le focus :
    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
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    /*
     * Copyright (c) 2005-2007 Nathanaël Roberts. All Rights Reserved.
     *
     * Redistribution and use in source and binary forms, with or without 
     * modification, are permitted provided that the following conditions are met:
     * 
     *  o Redistributions of source code must retain the above copyright notice, 
     *    this list of conditions and the following disclaimer. 
     *     
     *  o Redistributions in binary form must reproduce the above copyright notice, 
     *    this list of conditions and the following disclaimer in the documentation 
     *    and/or other materials provided with the distribution. 
     *     
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
     */
     
    /**
     * Utilities for focus (behavior, policy, events,...).
     * 
     * @author Nathanaël Roberts
     */
    public final class FocusUtils {
     
    	/** Only instance of FocusOwnerListener */
    	private static FocusOwnerListener s_focusOwnerListener;
     
    	/**
             * Hidden Constructor
             */
    	private FocusUtils() { }
     
    	/**
             * Add a listener on property <code>focusOwner</code> in the {@link KeyboardFocusManager}
             * in order to have an autoscroll behavior when an hidden component nested in a JScrollPane
             * will get the focus.
             */
    	public static void initFocusTrackerForAutoScroll() {
    		if (s_focusOwnerListener == null) {
    			KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    			s_focusOwnerListener = new FocusOwnerListener();
    			kfm.addPropertyChangeListener("focusOwner", s_focusOwnerListener);
    		}
    	}
     
    	/**
             * Activate or deactivate the {@link FocusOwnerListener} for special scrolling actions.
             * 
             * @param active
             */
    	public static void activateFocusOwnerListener(boolean active) {
    		if (s_focusOwnerListener == null) {
    			initFocusTrackerForAutoScroll();
    		}
    		if (s_focusOwnerListener != null) {
    			s_focusOwnerListener.setActive(active);
    		}
    	}
     
    	/**
             * Deactivate the {@link FocusOwnerListener} <code>number*2</code> times.
             */
    	public static void deactivateFocusOwnerListenerFor(int number) {
    		if (s_focusOwnerListener == null) {
    			initFocusTrackerForAutoScroll();
    		}
    		if (s_focusOwnerListener != null) {
    			s_focusOwnerListener.deactivate(number);
    		}
    	}
     
    	/**
             * The FocusOwnerListener.
             */
    	private static class FocusOwnerListener implements PropertyChangeListener {
    		private int m_deactivcount;
    		private int m_deactivate;
    		private boolean m_active = true;
    		public void propertyChange(PropertyChangeEvent e) {
    			// Abort if not active
    			if (!m_active) {
    				return;
    			}
    			// If deactive one time
    			if (m_deactivcount < m_deactivate) {
    				m_deactivcount++;
    				return;
    			}
    			// Scroll to focused element
    			Object newValue = e.getNewValue();
    			if (newValue != null && newValue instanceof Component) {
    				Component comp = (Component) newValue;
    				JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, comp);
    				while ((jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, comp)) != null) {
    					// Do not auto scroll for any other JPanel => but continue in case of nested JScrollPane
    					if (!(jsp.getViewport().getView() instanceof JPanel)) {
    						comp = jsp;
    						continue;
    					}
    					// Calculate auto scroll
    					JViewport jvp = jsp.getViewport();
    					Rectangle scrollRect = SwingUtilities.convertRectangle(comp, new Rectangle(0, 0, 0, 0), jvp);
    					if (scrollRect.y + comp.getSize().height > jvp.getViewRect().height) {
    						scrollRect.y = scrollRect.y - jvp.getViewRect().height + comp.getSize().height;
    					} else if (scrollRect.y < 0) {
    						scrollRect.y -= comp.getSize().height;
    					} else {
    						scrollRect.y = 0;
    					}
    					scrollRect.height = comp.getSize().height + jvp.getHeight();
    					jvp.scrollRectToVisible(scrollRect);
     
    					// Recursive
    					comp = jsp;
    				}
    			}
    		}
    		public boolean isActive() {
    			return this.m_active;
    		}
    		public void setActive(boolean active) {
    			this.m_active = active;
    		}
    		public void deactivate(int number) {
    			this.m_deactivcount = 0;
    			this.m_deactivate = number * 2;
    		}
    	}
     
    }
    Si tu trouves des bugs ou que tu améliores cette classe, merci de me tenir informé.

    ++
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Points : 102
    Points
    102
    Par défaut :)
    Merci pour ta réponse.

    J'ai regardé attentivement ton code et il m'a permis de voir la notion que je n'avais pas et nottamment le getViewPort.

    Merci encore Natha, ton aide m'a été précieuse.


    Edit: je ne mets pas encore en Résolu car j'ai un petit bug avec l'ascenceur pour le remonter mais je vais chercher encore un peu.

    ReEdit: C'est nikel. Il y avait effectivement tout ce qu'il fallait dans ta classe. Merci

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    De rien
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

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

Discussions similaires

  1. JScrollPane et JPanel - aucune scrollbar n'apparaît
    Par coyote999 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 23/04/2011, 23h48
  2. [JScrollPane] Comportement par défaut scrollbar vertical
    Par maxime_c dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 25/03/2009, 15h41
  3. [JTable + JScrollpane] affichage de la scrollbar impossible
    Par JoNjOn06 dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 11/08/2008, 11h48
  4. [JScrollPane] positionnement des scrollbars
    Par Dnasty dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/03/2006, 14h46
  5. [JScrollPane]Comment savoir quand une scrollbar apparait ?
    Par FrigoAcide dans le forum Composants
    Réponses: 4
    Dernier message: 29/04/2004, 10h10

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