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

Agents de placement/Fenêtres Java Discussion :

Redimensionnement des composants à l'intérieur d'un GridLayout


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut Redimensionner des composants d'un GridLayout & probleme avec SpringLayout
    Bonjour,

    J'ai un petit souci avec un GridLayout.

    J'ai actuellement une petite application qui crée un JTree en fonction d'un fichier XML. A chaque nœud de cet arbre correspond un dossier d'images. Lorsque je clique sur un nœud, des miniatures de chaque image doivent s'afficher dans un GridLayout. Le problème est que, selon que j'ai 100 images ou seulement 2 à afficher, la taille des miniatures n'est pas là même, ce qui est plutôt très moche.

    Ce que j'ajoute au JPanel sont des JLabel, chaque JLabel contenant un ImageIcon. La taille des JLabel étant censé être la même.

    Le petit bout de code qui me semble être important :

    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
     
            //Le panel contenant les miniatures est contenu dans un JScrollPane si le nombre de miniatures à afficher est trop important
    JScrollPane jsp = new JScrollPane(panelMiniaturesPhotos, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
     
     
    	/**
             * Methode qui modifie le GridLayout en fonction du nombre de lignes à afficher.
             * @param numberOfPhotos Le nombre de photos à afficher
             */
    	public void setNewGridLayout(int numberOfPhotos) {
    		panelMiniaturesPhotos.removeAll();
    		GridLayout gl = (GridLayout) panelMiniaturesPhotos.getLayout();
    		gl.setColumns(3);
    		gl.setHgap(10);
    		gl.setVgap(15);
    		gl.setRows(((Double)Math.ceil(numberOfPhotos/3)).intValue()+1);
    		panelMiniaturesPhotos.setLayout(gl);
    	}
     
    	/**
             * Methode qui ajoute une photo au panel
             * @param photoSelected le path vers la photo à ajouter
             */
    	public void addPhotoMiniature(String path) {
    		ImageIcon photoSelected = new ImageIcon(path);
    		JLabel pp = new JLabel(photoSelected);
    		pp.setPreferredSize(new Dimension(100,70));
    		pp.repaint();
    		panelMiniaturesPhotos.add(pp);
    		panelMiniaturesPhotos.repaint();
    	}
    J'ai un peu du mal à comprendre pourquoi les miniatures n'ont pas la même hauteur selon le nombre à afficher.

    Si quelqu'un a une idée, je la prends avec plaisir.

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Comme il est indiqué ici et , le GridLayout divise l'espace disponible en cellules de tailles égales, et donc ne tient aucun compte de la preferredSize.

    Solutions possibles :
    • caler toujours le GridLayout au nombre maximal d'images possible
    • utiliser un SpringLayout (guide ici), plus difficile à manier, mais plus amical avec la preferred
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    Merci gifffftane pour la réponse.

    Je vais essayer de m'en sortir avec les SpringLayout, qui me semblent être la meilleure solution. Je vous fais signe dès que ça marchera nickel... autant dire que ca peut prendre un peu de temps

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    Bon, après test, je suis plutôt satisafait du SpringLayout, puisque mes images font maintenant toutes la même dimension, ce que je voulais au départ. Cependant, un nouveau problème m'est apparu, problème que je n'arrive pas à résoudre...

    En effet, avant d'utiliser le SpringLayout, mes images étaient certes redimensionnées, mais il était possible de les faire défiler lorsqu'il y en avait beaucoup.

    Désormais, avec le SpringLayout, je ne vois que les premières images, et je n'ai plus de scrollbar, ce qui est plutôt très gênant en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Dans le constructeur de l'Interface
     
    panelMiniaturesPhotos = new JPanel(new SpringLayout());
    JScrollPane jsp = new JScrollPane(panelMiniaturesPhotos);
    tabInfos.addTab("Miniatures photos", jsp);
    L'ajout des photos se fait dans la méthode suivante :
    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
    public void addPhotoMiniatures(LinkedList<String> listOfPhotosInsideDirectory) {
    		panelMiniaturesPhotos.removeAll();
    		Iterator<String> i = listOfPhotosInsideDirectory.iterator();
    		String path;
    		JLabel tmp1 = null, tmp2 = null, tmp3 = null;
    		double number = 0;
    		while(i.hasNext()) {
    			path = i.next();
    			ImageIcon photoSelected = new ImageIcon(path);
    			JLabel pp = new JLabel(photoSelected);
    			pp.setPreferredSize(new Dimension(190,120));
    			pp.repaint();
    			pp.addMouseListener(new OneExifPhotoListener(this, path, pp));
    			panelMiniaturesPhotos.add(pp);
    			if(number < 3) { //Pour les 3 premières images
    				if(number == 0) { //Si c'est la première photo, on la place en haut à gauche
    					((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.WEST, pp, 5, SpringLayout.WEST, jsp);
    				} else { //Sinon, pour les 2eme et 3eme photos, on les place horizontalement à 5 unités de la précédente
    					((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.WEST, pp, 5, SpringLayout.EAST, tmp1);
    				} //La nouvelle photo est placé à 5 unités du bord supérieur du layout
    				((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.NORTH, pp, 5, SpringLayout.NORTH, jsp);
    			} else { //Pour les autres
    				if(number/3 - Math.round(number/3) == 0) { //Si elle est dans la premiere colonne (multiple de 3), on crée des contraintes pour que la photo soit a 5 unités du bord du layout (horizontalement)
    					((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.WEST, pp, 5, SpringLayout.WEST, jsp);
    				} else { //Sinon, elle est placée horizontalement à 5 unité de la photo précédente
    					((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.WEST, pp, 5, SpringLayout.EAST, tmp1);
    				} //La nouvelle photo est placée 5 unités en dessous de celle placée en avant-avant-dernier.
    				((SpringLayout)panelMiniaturesPhotos.getLayout()).putConstraint(SpringLayout.NORTH, pp, 5, SpringLayout.SOUTH, tmp3);
    			}
     
    			tmp3 = tmp2;
    			tmp2 = tmp1;
    			tmp1 = pp;
    			number++;
    		}
    		panelMiniaturesPhotos.repaint();
    	}
    Est-ce que SpringLayout et JScrollPane sont incompatibles où, ce qui me semble plus vraisemblable, je ne les utilise pas bien ?

    Merci d'avance à tous ceux qui se pencheront sur mon cas.

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Oui mais avant, au lieu de faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JScrollPane jsp = new JScrollPane(panelMiniaturesPhotos);
    ... tu faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    JScrollPane jsp = new JScrollPane(
      panelMiniaturesPhotos, 
      JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
      JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    Hum.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    En effet, mais cela ne change rien. Que je mette l'un ou l'autre, toujours pas de scrollbar.

  7. #7
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    As-tu appliqué Dynamically Changing the Client's Size de How to Use Scroll Panes ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Points : 145
    Points
    145
    Par défaut
    Ahhhh !!!

    Je faisais bien le revalidate() et le repaint(), mais pas le setPreferredSize()...

    Je te remercie beaucoup gifffftane !!

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

Discussions similaires

  1. Pas de redimensionnement des composants
    Par Dimitri_87 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/03/2008, 10h32
  2. pb de redimensionnement des composants?
    Par kheldoun ahmed dans le forum Delphi
    Réponses: 1
    Dernier message: 20/05/2007, 16h25
  3. Réponses: 9
    Dernier message: 29/01/2007, 11h00
  4. redimensionnement des composants par l'utilisateur
    Par osoumayaj dans le forum JBuilder
    Réponses: 2
    Dernier message: 05/10/2006, 10h15
  5. Redimensionnement des composants
    Par hush dans le forum Agents de placement/Fenêtres
    Réponses: 20
    Dernier message: 21/08/2005, 11h07

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