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 :

Création dynamique des boutons dans ScrollPane


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    etudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 13
    Points
    13
    Par défaut Création dynamique des boutons dans ScrollPane
    Bonjour,

    Je veux afficher des boutons d'une façon dynamique avec une interface Swing.
    Le problème c'est que les boutons ne s'affichent pas tous comme si il n' ya pas une ScrollPane malgré que j'ai fait un scrollPane.
    Je souhaite afficher les boutons d'une manière verticle.

    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
     panel = new JPanel();
       //panel.setBounds(286, 300, 388, 368);   
       panel.setLayout(null);
       scrollPane = new JScrollPane(panel);
       scrollPane.setBounds(286,300, 368, 346);
       scrollPane.setAutoscrolls(true);
       add(scrollPane);
     
     
        for ( int i =0; i<SelectPDM.vectClassPDM.size();i++){
         JButton JButtonb2 =new JButton(SelectPDM.vectClassPDM.get(i).getNom());
         JButtonb2.setBounds(20,k, 150, 25);
         JButtonb2.setIcon(new ImageIcon("Images/class.gif"));
         panel.add(JButtonb2);
               k=k+26;
               scrollPane.repaint();
     
        }
        for ( int i =0; i<SelectPDM.vectAssoPDM.size();i++){
         JButton JButtonb2 =new JButton(SelectPDM.vectAssoPDM.get(i).getNom());
         JButtonb2.setBounds(20,k, 150, 25);
         JButtonb2.setIcon(new ImageIcon("Images/asso.png"));
         panel.add(JButtonb2);
               k=k+26;
               scrollPane.repaint();
      }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Utilises un layout manager (par exemple, un GridLayout, avec un nombre de colonnes fixes, et, donc, un nombre de lignes quelconques, te permettant d'ajouter autant de lignes que tu veux) : dans ce cas le JPanel connaitra sa taille, et le JScrollPane pourra s'adapter automatiquement en l'utilisant.

    Si tu veux absolument te passer de layout (ce qui n'est jamais une bonne idée, vu que ça rigidifie l'interface, qui ne s'adapte plus à la foultitude de format d'écran, de fenêtre, etc, qu'on trouve maintenant), et il te faudra calculer toi même les dimensions du JPanel, pour affecter la preferredSize en particulier.

    Accessoirement, les repaint() ne servent à rien dans ton code : soit tu ajoutes tes boutons avant l'affichage complet, et ils n'y a pas besoin de rafraîchir l'affichage, soit tu le fais après, et c'est surtout le layout qu'il faudra mettre à jour, par un revalidate().

  3. #3
    Membre à l'essai
    Homme Profil pro
    etudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Merci pour votre aide.
    ça marche mais le problème c'est que l'affichage apparaît horizontalement.


    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
    		panel = new JPanel();
    			//panel.setBounds(10, 10, 600, 600);
     
    				for ( int i =0; i<SelectPDM.vectClassPDM.size();i++){
    					JButton JButtonb2 =new JButton(SelectPDM.vectClassPDM.get(i).getNom());
    					JButtonb2.setBounds(20,k, 150, 25);
    					JButtonb2.setIcon(new ImageIcon("Images/class.gif"));
    					panel.add(JButtonb2);
    			        k=k+26; 
    				}
     
    				for ( int i =0; i<SelectPDM.vectAssoPDM.size();i++){
    					JButton JButtonb2 =new JButton(SelectPDM.vectAssoPDM.get(i).getNom());
    					JButtonb2.setBounds(20,k, 150, 25);
    					JButtonb2.setIcon(new ImageIcon("Images/asso.png"));
    					panel.add(JButtonb2);
    			        k=k+26;
    				}
     
    				GridBagLayout gbl_panel = new GridBagLayout();
    				gbl_panel.columnWidths = new int[]{0};
    				gbl_panel.rowHeights = new int[]{0};
    				gbl_panel.columnWeights = new double[]{Double.MIN_VALUE};
    				gbl_panel.rowWeights = new double[]{Double.MIN_VALUE};
    				panel.setLayout(gbl_panel);
    				scrollPane = new JScrollPane(panel);
    				scrollPane.setBounds(286,300, 368, 346);
    				scrollPane.validate();
    				scrollPane.repaint();
    				scrollPane.setAutoscrolls(true);
    				add(scrollPane);

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    J'avais dit un GridLayout : ce qui te gènes, c'est que les colonnes ont la même largeur ? Alors, utilises en effet un GridBagLayout, mais c'est plus complexe : en particulier, il faut indiquer des contraintes pour chaque composant, avec notamment leur position dans la grille. Par contre, pas besoin, à priori, de faire quelque chose d'aussi complexe avec le layout lui-même.

    Exemple :

    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
    public class DemoDynFields { 
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(new Runnable() {
     
    			@Override
    			public void run() {
    				createFrame();
    			}
    		});
     
    	}
    	private static void createFrame() {
     
    		JFrame frame = new JFrame("Demo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel();
    		GridBagLayout gridLayout = new GridBagLayout();
    		panel.setLayout(gridLayout);
    		for(int i=1; i<=100; i++) {
    			JLabel label = new JLabel("Champ " + i);
    			GridBagConstraints labelConstraints = new GridBagConstraints();
    			labelConstraints.gridx=0; // numéro de colonnes
    			labelConstraints.gridy=i-1; // numéro de lignes
    			labelConstraints.weightx=0; // répartition dans la largeur (0 prend sa taille max)
    			labelConstraints.fill=GridBagConstraints.BOTH; // remplissage (rempli au max)
    			panel.add(label, labelConstraints);
    			JTextField field = new JTextField();
    			GridBagConstraints fieldConstraints = new GridBagConstraints();
    			fieldConstraints.gridx=1;
    			fieldConstraints.gridy=i-1;
    			fieldConstraints.weightx=1;
    			fieldConstraints.fill=GridBagConstraints.BOTH;
    			panel.add(field, fieldConstraints); 
    		}
     
    		frame.setContentPane(new JScrollPane(panel));
     
    		frame.setSize(200,200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    etudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : etudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Merci bien monsieur,
    Le code fonctionne bien.. Puis-je mettre les boutons à gauche au de les mettre centrer?

    En fait je veux faire une chose comme ça.
    Nom : Capture.PNG
Affichages : 278
Taille : 86,5 Ko

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Avec le code donnée (labelConstraints.fill=GridBagConstraints.BOTH; // remplissage (rempli au max)) il devrait prendre toute la place donc il n'y a pas de notion de haut/ gauche / centré.


    Quand il n'occupe pas toute la case, tu peux utiliser GridbagConstraints.anchor pour préciser sa position par rapport à la case

Discussions similaires

  1. ajouter dynamiquement des items dans un popup menu
    Par Malone dans le forum Composants VCL
    Réponses: 7
    Dernier message: 23/08/2005, 16h08
  2. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50
  3. Pouvoir gérer les actions des boutons dans une classe
    Par Cyborg289 dans le forum Composants
    Réponses: 2
    Dernier message: 08/07/2005, 12h08
  4. [FLASH MX] Action des boutons dans un menu déroulant
    Par zab_paris dans le forum Flash
    Réponses: 1
    Dernier message: 05/07/2005, 18h14
  5. Réponses: 2
    Dernier message: 31/08/2002, 14h00

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