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 :

FlowLayout ne renvoie pas le composant à la ligne


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2014
    Messages : 70
    Points : 35
    Points
    35
    Par défaut FlowLayout ne renvoie pas le composant à la ligne
    Bonjour,

    J'ai pour mission actuellement de refaire un launcher et pour le réaliser j'ai décidé d'utiliser Swing et AWT. J'ai décidé d'utiliser les différents Layout proposés car même si ma fenêtre ne sera pas redimensionnable je préfère éviter les setBounds partout et essayer d'apprendre à coder "proprement".

    Mon problème est qu'ici lorsque je souhaite ajouter des boutons dans ma méthode mainBoutons(), ceux ci ne sont pas renvoyés à la ligne malgré le FlowLayout utilisé aussi bien pour la fenêtre que pour le JPanel que j'utilise dans cette fonction. Pourriez-vous m'indiquer pourquoi svp ?

    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
     
    import java.awt.*;
    import javax.swing.*;
     
    public class Test {
     
    	private int valNode = 1;
    	JFrame fen = new JFrame();
    	JPanel advanced = new JPanel();
     
        public Test () 
        {
            initFenetre();
            initEntete();
            initMain();
            mainBoutons();
        }
     
        public void initFenetre()
        {        
    		fen.setTitle("Launcher");
    		fen.setSize(600, 400);
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fen.setResizable(false);
    		fen.setLocationRelativeTo(null);
    		fen.setVisible(true);
    		fen.setLayout(new FlowLayout(0, 0, 0));
        }
        public void initEntete()
        {
        	JPanel entete = new JPanel();
        	JLabel[] texteEntete = new JLabel[2];
        	JButton boutonHelp = new JButton();
    		entete.setLayout(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints();
    		texteEntete[0] = new JLabel("      Node id : " + valNode);
    		texteEntete[1] = new JLabel("Impossible d'afficher les coordonnées GPS");
     
    		gbc.gridx = 0;
    		gbc.gridy = 0;
    		gbc.insets = new Insets(10, 0, 10, 135); //Insets gère l'espacement(top, left, bot,right)
    		entete.add(texteEntete[0], gbc);
     
    		gbc.gridx = 1;
    		gbc.gridy = 0;
    		gbc.insets = new Insets(10, 0, 10, 105);
    		entete.add(texteEntete[1], gbc);
    		gbc.gridx = 2;
    		gbc.gridy = 0;
    		gbc.insets = new Insets(8, -10, 8, 20); // -10 pour rapprocher de l'élément à gauche
     
    		entete.add(boutonHelp, gbc);
    		boutonHelp.setIcon(new ImageIcon(getClass().getResource("Help.png")));
    		boutonHelp.setPreferredSize(new Dimension(32, 32));
     
    		entete.setBackground(new Color(184, 229, 255));
    		fen.add(entete);
    		fen.getContentPane().setBackground(new Color(224, 224, 224));
        }
     
        public void initMain()
        {
        	JPanel main = new JPanel();
        	JLabel mainTexte = new JLabel("MAIN APPLICATIONS");
        	main.setLayout(new GridBagLayout());
        	GridBagConstraints gbc = new GridBagConstraints();
     
    		gbc.gridx = 0;
    		gbc.gridy = 0;
    		gbc.insets = new Insets(10, 240, 10, 240);
        	main.add(mainTexte, gbc);
     
        	fen.add(main);
        }
     
        public void mainBoutons()
        {
        	JPanel mainBoutons = new JPanel();
        	int nbBoutons = 50;
        	JButton boutons[] = new JButton[nbBoutons];
        	mainBoutons.setLayout(new FlowLayout(0,50,10));
        	for(int i = 0; i < nbBoutons ; i++)
        	{
        		boutons[i] = new JButton("" + i);
        		boutons[i].setPreferredSize(new Dimension(64, 64));
        		mainBoutons.add(boutons[i]);
        	}
        	fen.add(mainBoutons);
        }
     
        public static void main(String[] args) 
        {
            new Test();
        }
    }
    PS : N'hésitez pas à me dire si certaines choses ne sont pas à faire, n'étant qu'en deuxième année de BTS et ayant commencé les interfaces graphiques seulement cette année, je vous avoue que mon expérience est très limitée !

    Merci de votre aide

  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,

    En fait tu ajoutes les 3 éléments directement à ta fenêtre à laquelle tu as mis un FlowLayout : les composants sont donc mis les uns à la suite de autres en occupant chacun toute la largeur dont ils ont besoin, et passent à la ligne s'ils sont trop larges pour être affichés (une fois seulement - du coup on ne voit pas leur partie à droite s'ils sont trop large). Ceci y compris mainBoutons qui réclament la largeur nécessaire pour afficher 50 boutons. Dans un FlowLayout, la largeur des composants n'est pas contrainte par le container mais pas le composant.

    Déjà, personnellement, je préfère toujours faire un JPanel que que je mets soit dans le contentPane, soit en tant que contentPane. Mais tu peux travailler directement dans la fenêtre si tu veux. Mais par contre, je diviserais ton interface en 2 parties, une partie entête + main (donc les 2 dans un JPanel intermédiaire, appelons le baniere), et une partie mainBoutons. Sur le JPanel principal (celui que je mets en contentPane ou la JFrame dans ton cas), je mettrais un BorderLayout. Ensuite je placerais baniere en BorderLayout.NORTH et mainBouton en BorderLayout.CENTER).

    Sinon, pour l'instant, j'ai regardé vite fait et je n'ai rien vu d'horrible, mais je te conseille d'utiliser les constants SWING pour configurer tes composants, parce que c'est quand même bien plus lisible : là où tu fais new FlowLayout(0,50,10) fais new FlowLayout( FlowLayout.LEFT, 50, 10 ), on comprend quand mieux que c'est aligné à gauche.
    Après, évite de définir des variables de classes que tu n'utilises que localement (de manière général, définit toujours tes variables dans le scope le plus bas indispensable pour ton fonctionnement)), ce sera plus clean. Pareil, évite les variables qui ne servent à rien comme le tableaux qui ne servent à rien comme JButton boutons[]. Enfin, évite l'écriture new JButton("" + i); (un truc de javscripteur pour moi) et préfère lui new JButton( String.valueOf(i) );On pourrait ajouter, pour une application plus pérenne (autre qu'un exercice de TP, mais pourquoi pas pour faire un TP plus clean) qu'utiliser une constante (final static) pour "Help.png" serait plus propre aussi (plutôt que d'avoir cette mention en plein milieu du code). Moins important je pense dans ton contexte, pour les chaînes aussi, on devrait envisager des ResourceBundle (permet l'externalisation des chaînes littérales, dans le but d'internationaliser en général) mais c'est peut être un peu too much pour un exercice : déjà, des constantes te permettrons plus facilement d'adapter ces messages au besoin, sans les parcourir tout le code pour les retrouver.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    En dessous de la ligne 78 de ton code, ajoute cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            mainBoutons.setPreferredSize(new Dimension(300, 500));
    les dimensions ont été prises au hasard pour t'inviter à la méditation sur le setPreferredSize
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2014
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    joel.drigo : Merci pour ce long message plein de conseils. Les éléments n'étaient donc pas remis à la ligne grâce au FlowLayout car, contrairement à la JFrame, aucune taille n'était définie c'est cela ? C'est en tout cas ce que j'ai cru comprendre grâce au message de Népomucène.

    J'ai pris en compte tes différentes remarques telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new FlowLayout( FlowLayout.LEFT, 50, 10 )
    ainsi que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new JButton( String.valueOf(i) );
    et les ai mises dans mon code. J'ai aussi pris en compte ta remarque sur la déclaration des variables.


    Citation Envoyé par Népomucène Voir le message
    En dessous de la ligne 78 de ton code, ajoute cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            mainBoutons.setPreferredSize(new Dimension(300, 500));
    les dimensions ont été prises au hasard pour t'inviter à la méditation sur le setPreferredSize
    Le setPreferredSize a ici permit de donner une taille au JPanel, si j'ai bien compris c'est l'absence de taille définie qui empêchait au FlowLayout de renvoyer a la ligne une fois cette taille atteinte ?

  5. #5
    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
    Citation Envoyé par snyler Voir le message
    Le setPreferredSize a ici permit de donner une taille au JPanel, si j'ai bien compris c'est l'absence de taille définie qui empêchait au FlowLayout de renvoyer a la ligne une fois cette taille atteinte ?
    Le setPreferredSize permet d'indiquer une taille préférentielle explicite : sinon, la taille préférentielle est la taille nécessaire pour afficher tous les boutons en largeur. Donc, effectivement, ça fonctionne si tu forces la taille préférentielle à une taille prédéfinie correspondant à la largeur de la fenêtre (moins les insets éventuels). Par contre, il faut penser que tu ne peux pas prévoir la taille qu'aura l'écran de l'utilisateur final : avec des tailles fixées, l'utilisateur sera contraint d'avoir la taille que tu imposes. Pour des éléments petits, comme tes boutons, ça pose normalement peu de problèmes, mais pour la fenêtre entière, ça peut être gênant. Exemple : moi qui utilise mon pc avec écran détachable de 10 pouces en portrait, pas sûr, que la fenêtre tienne complètement dans la largeur. Personnellement, je préfère toujours laisser l'utilisateur choisir librement la taille qu'il veut pour son interface graphique.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Apprenti
    Inscrit en
    Octobre 2014
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti

    Informations forums :
    Inscription : Octobre 2014
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Le setPreferredSize permet d'indiquer une taille préférentielle explicite : sinon, la taille préférentielle est la taille nécessaire pour afficher tous les boutons en largeur. Donc, effectivement, ça fonctionne si tu forces la taille préférentielle à une taille prédéfinie correspondant à la largeur de la fenêtre (moins les insets éventuels). Par contre, il faut penser que tu ne peux pas prévoir la taille qu'aura l'écran de l'utilisateur final : avec des tailles fixées, l'utilisateur sera contraint d'avoir la taille que tu imposes. Pour des éléments petits, comme tes boutons, ça pose normalement peu de problèmes, mais pour la fenêtre entière, ça peut être gênant. Exemple : moi qui utilise mon pc avec écran détachable de 10 pouces en portrait, pas sûr, que la fenêtre tienne complètement dans la largeur. Personnellement, je préfère toujours laisser l'utilisateur choisir librement la taille qu'il veut pour son interface graphique.
    En effet c'est ce que j'avais compris, on affecte une taille pour forcer l'ajustement des composants.

    Merci pour ton aide, je mets le sujet en résolu.

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

Discussions similaires

  1. [CR XI] Affiché 0 sur une commande qui ne renvoi pas de ligne
    Par Rits dans le forum Débuter
    Réponses: 1
    Dernier message: 01/03/2010, 14h49
  2. [ACCESS SQL] UNION renvoie pas le bon nb de lignes
    Par le lynx dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/06/2006, 10h57
  3. Requête UNION renvoie pas le bon nombre de lignes
    Par le lynx dans le forum Contribuez
    Réponses: 2
    Dernier message: 29/06/2006, 10h52
  4. Réponses: 2
    Dernier message: 12/01/2005, 23h08
  5. jointure renvois pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/08/2002, 12h51

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