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 :

[JScrollPane]Bloquer le défilement dans un sens


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut [JScrollPane]Bloquer le défilement dans un sens
    Bonjour à tous,

    Je me retrouve avec un problème plutôt embettant. Enfaite, j'ai un bouton qui crée des vignettes (qui sont des boutons enfaite) dans un JPanel en FlowLayout. Donc une nouvelle vignette apparait toujours après la précédente ou va à la ligne si la ligne est pleine. Mon problème est que si je met ce JPanel dans un JScrollPane, lors de la création d'une nouvelle vignette, si la ligne est pleine, elle va dépasser la fenêtre sur le côté droite et la barre de défilement horizontale va apparaitre. Or moi j'aimerais qu'elle aille à la ligne qu'il y est exclusivement la barre de défilement verticale qui apparaisse lorsque ça dépasse en hauteur et non en largeur.

    La question est : Est-ce qu'il y a moyen de forcer le défilement en vertical plutôt que en vertical/horizontal ?

    J'ai déjà cherché sur Google mais je n'ai rien trouvé.

    Merci d'avance,

    Benjamin

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Je pense que la méthode : setHorizontalScrollBarPolicy(...) répond à ton besoin.

    En allant sur cette page (là où tu devrais aller en priorité dans ce genre de cas), tu trouveras les informations relatives à son utilisation. Utilise la constante ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER pour indiquer que tu ne veux pas de ScrollBar horizontal.

    Cdlt

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par piou1234 Voir le message
    Je pense que la méthode : setHorizontalScrollBarPolicy(...) répond à ton besoin.
    Malheureusement non ! setHorizontalScrollBarPolicy() sert simplement à cacher la scrollbar, et le JPanel sera tronqué sans moyen de voir le contenu en trop...



    En fait les JScrollPane affiche les composants dans leurs preferredSizes, qui est généralement déterminé par le layout. Le problème vient du fait que le FlowLayout calcule la preferredSize en alignant tous les composants sur une seule et unique ligne, ce qui fait qu'on obtient une preferredSize très large...

    Le JScrollPane respectent donc cela et donne au JPanel la taille voulu... ce qui fait apparaitre la scrollbar horizontal !



    Pourtant si on fixe la taille du JPanel, les composants passeront bien à la ligne car le FlowLayout le gère très bien... mais pas pour le calcul de la preferredSize !



    La solution serait donc d'étendre FlowLayout afin de le forcer à calculer la preferredSize en utilisant une largeur maximum.

    En ce basant sur le code du FlowLayout, cela peut donner ceci :
    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
    /**
     * FlowLayout dont la largeur s'adapte selon la largeur du conteneur parent.
     * Cela permet de ne pas afficher la scrollbar horizontal lorsqu'il est placé
     * dans une JScrollPane...
     * 
     * @author adiGuba
     */
    class WrapFlowLayout extends FlowLayout {
    	/* serialVersionUID */
    	private static final long serialVersionUID = 1L;
     
    	@Override
    	public Dimension preferredLayoutSize(Container target) {
    		final Container parent = target.getParent();
    		if (parent != null) {
    			final int width = parent.getWidth();
    			return new Dimension(width, calculateHeight(target, width));
    		}
    		return super.preferredLayoutSize(target);
    	}
     
    	@Override
    	public Dimension minimumLayoutSize(Container target) {
    		final Container parent = target.getParent();
    		if (parent != null) {
    			final int width = parent.getWidth();
    			return new Dimension(width, calculateHeight(target, width));
    		}
    		return super.minimumLayoutSize(target);
    	}
     
    	/**
             * Calcule la hauteur du layout avec une largeur fixe
             */
    	public int calculateHeight(Container target, int width) {
    		Insets insets = target.getInsets();
    		final int vgap = getVgap();
    		final int hgap = getHgap();
    		// On calcule la taille du contenu :
    		final int innerWidth = Math.max(0, width - (insets.left + insets.right + hgap * 2));
    		// On initialise la taille avec les marges
    		int height = insets.top + insets.bottom + vgap;
     
    		synchronized (target.getTreeLock()) {
    			Dimension dim = new Dimension(0, 0);
     
    			boolean firstVisibleComponent = true;
    			final boolean useBaseline = getAlignOnBaseline();
    			int maxAscent = 0;
    			int maxDescent = 0;
     
    			final int nmembers = target.getComponentCount();
    			for (int i = 0; i < nmembers; i++) {
    				Component m = target.getComponent(i);
    				if (m.isVisible()) {
    					Dimension d = m.getPreferredSize();
     
    					if (firstVisibleComponent) {
    						// Si on est sur le premier composant, on doit l'ajouter :
    						dim.width = d.width;
    						dim.height = d.height;
    						firstVisibleComponent = false;
    					} else if ((dim.width + hgap + d.width) <= innerWidth) {
    						// Si on peut ajouter un composant sur la ligne, on le fait
    						dim.width += hgap + d.width;
    						dim.height = Math.max(dim.height, d.height);
    					} else {
    						// On ne peut plus ajouter de composants, on fait une nouvelle ligne
    						if (useBaseline) {
    							dim.height = Math.max(maxAscent + maxDescent, dim.height);
    						}
    						height += dim.height + vgap;
     
    						// Et on "met" le composant sur la nouvelle ligne
    						dim.width = d.width;
    						dim.height = d.height;
    						maxAscent = 0;
    						maxDescent = 0;
    					}
    					if (useBaseline) {
    						int baseline = m.getBaseline(d.width, d.height);
    						if (baseline >= 0) {
    							maxAscent = Math.max(maxAscent, baseline);
    							maxDescent = Math.max(maxDescent, d.height - baseline);
    						}
    					}
    				}
    			}
    			if (dim.height!=0) {
    				if (useBaseline) {
    					dim.height = Math.max(maxAscent + maxDescent, dim.height);
    				}
    				height += dim.height + vgap;
    			}
    			return height;
    		}
    	}
    }

    a++

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci pour ces réponses,

    Entre temps j'ai trouvé ce code : http://forums.sun.com/thread.jspa?th...sageID=4439726 qui marche.

    Je vais également tester le tien.

    Merci,

    Benjamin

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Points : 191
    Points
    191
    Par défaut
    Je sais que je déterre un peu, mais vu que j'ai galéré pas mal pour arriver ici, je me dis que ça vaut le coup...

    Donc juste pour dire que la solution de adiGuba fonctionne !

    Le seul problème c'est que si on agrandi la fenêtre puis qu'on la rétrécie, la maximum size utilisée est la taille de la fenêtre après l'agrandissement (en bref quand on rétrécit la fenêtre, ce n'est pas pris en compte)... mais ça ne devrait pas être bien compliqué à résoudre.

    Bref merci adiGuba !

    Edit : En effet c'était pas compliqué, un petit ComponentListener à mettre sur la fenêtre et la méthode componentResized à modifier en conséquence pour mettre à jour la taille du Panel.

Discussions similaires

  1. [JScrollPane] vitesse de défilement
    Par spoutyoyo dans le forum Composants
    Réponses: 3
    Dernier message: 10/11/2008, 15h16
  2. [FLASH MX] scrollbar et défilement dans flash
    Par Mout85 dans le forum Flash
    Réponses: 6
    Dernier message: 08/10/2008, 15h01
  3. [Partage de fichiers] Impossible dans un sens
    Par Raideman dans le forum Windows XP
    Réponses: 5
    Dernier message: 19/12/2005, 09h54
  4. Mettre une barre de défilement dans une CheckListBox ?
    Par Invité dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/07/2005, 09h39

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