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 :

Pourquoi faire compliqué?


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 58
    Points
    58
    Par défaut Pourquoi faire compliqué?
    Bonsoir,

    Je me demande si il est possible dans une JFrame de placer un composant (genre JButton, JTextArea) à des coordonnées (x,y) quelconques.

    En effet pour l'instant je fais tout avec des Border,Grid et Flow Layout et ca me rend dingue car je m'arrache les cheveux en essayant d'imbriquer des panels les uns dans les autres avec des layout différents pour placer des composants ou je veux. (je n'ai presque plus de cheveux, au secours !!).

    N'existe-t-il pas un moyen de fournir les coordonnées exactes d'où l'on veut placer le composant?

    Autre question : je ne comprends pas pourquoi très souvent le layout demandé n'est pas respecté. Par exemple si je demande un gridLayout(25,2) il arrive souvent que la deuxieme colonne n'existe pas (Peut etre est-ce une question de place par rapport à la taille des composants?).

    Autre question : je ne comprends pas pourquoi alors que je rédéfinis la taille de mes bouttons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     hit = new JButton("hit me !");
             hit.setBackground(Color.blue);
             hit.setForeground(Color.red);
             hit.setPreferredSize(new Dimension(100,25));
     
    stand = new JButton("stand");
             stand.setBackground(Color.green);
             stand.setForeground(Color.red);
             stand.setPreferredSize(new Dimension(100,25));
    et qu'ensuite j'inclus ces boutons dans un panel muni d'un BorderLayout,par exemple au sud, je me retrouve avec mes boutons qui prennent toute la largeur de ma fenetre (ca non plus c'est pas bon pour mes cheveux !).

    Merci par avance.
    Akhan

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    pour les coordonnée faut utilisé un layout dont je ne connait plus le nom avec ensuite pour lpacé ton composant toncomposant.setBounds(); il me semble avec x,y,Lo,H comme attribut et entier bien sur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    La réponse à toutes tes questions se trouve dans la documentation.

    (1)
    N'existe-t-il pas un moyen de fournir les coordonnées exactes d'où l'on veut placer le composant?
    GridBagLayout ?

    (2)
    Par exemple si je demande un gridLayout(25,2) il arrive souvent que la deuxieme colonne n'existe pas (Peut etre est-ce une question de place par rapport à la taille des composants?).
    Documentation de GridLayout :
    When both the number of rows and the number of columns have been set to non-zero values, either by a constructor or by the setRows and setColumns methods, the number of columns specified is ignored. Instead, the number of columns is determined from the specified number or rows and the total number of components in the layout. So, for example, if three rows and two columns have been specified and nine components are added to the layout, they will be displayed as three rows of three columns. Specifying the number of columns affects the layout only when the number of rows is set to zero.
    (3)
    Autre question : je ne comprends pas pourquoi alors que je rédéfinis la taille de mes bouttons et qu'ensuite j'inclus ces boutons dans un panel muni d'un BorderLayout,par exemple au sud, je me retrouve avec mes boutons qui prennent toute la largeur de ma fenetre
    Documentation de BorderLayout :
    The components are laid out according to their preferred sizes and the constraints of the container's size. The NORTH and SOUTH components may be stretched horizontally; the EAST and WEST components may be stretched vertically; the CENTER component may stretch both horizontally and vertically to fill any space left over.
    Nicolas

    PS - tutorial SUN sur les layouts :
    http://java.sun.com/docs/books/tutor...out/using.html

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JPanel panel = new JPanel();
    container.setLayout(null);
    container.add(panel);
    panel.setBounds(bounds);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup !
    Je vais lire tout ca.

  6. #6
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Citation Envoyé par Akhan
    Bonsoir,

    Je me demande si il est possible dans une JFrame de placer un composant (genre JButton, JTextArea) à des coordonnées (x,y) quelconques.
    Tu ne dois pas utiliser de layout dans ce cas --> setLayout(null)
    et puis par exemple --> jLabel5.setBounds(new Rectangle(10, 170, 90, 20));

    Citation Envoyé par Akhan
    En effet pour l'instant je fais tout avec des Border,Grid et Flow Layout et ca me rend dingue car je m'arrache les cheveux en essayant d'imbriquer des panels les uns dans les autres avec des layout différents pour placer des composants ou je veux. (je n'ai presque plus de cheveux, au secours !!).
    Tu utilises un IDE ou tu fais tout à la main? Si oui je comprend que tu n'ai plus de cheveux. (pas de trolls plz, je sais aussi coder un gui à la main )

    Autre question : je ne comprends pas pourquoi très souvent le layout demandé n'est pas respecté. Par exemple si je demande un gridLayout(25,2) il arrive souvent que la deuxieme colonne n'existe pas (Peut etre est-ce une question de place par rapport à la taille des composants?).
    Si la colonnne n'existe pas c'est qu'il n'y a pas assez d'élément dans ton conteneur pour qu'il y ai besoin de la créer

    Autre question : je ne comprends pas pourquoi alors que je rédéfinis la taille de mes bouttons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     hit = new JButton("hit me !");
             hit.setBackground(Color.blue);
             hit.setForeground(Color.red);
             hit.setPreferredSize(new Dimension(100,25));
     
    stand = new JButton("stand");
             stand.setBackground(Color.green);
             stand.setForeground(Color.red);
             stand.setPreferredSize(new Dimension(100,25));
    et qu'ensuite j'inclus ces boutons dans un panel muni d'un BorderLayout,par exemple au sud, je me retrouve avec mes boutons qui prennent toute la largeur de ma fenetre (ca non plus c'est pas bon pour mes cheveux !).
    Ca dépend du layout que tu à mis dans le panel qui est au sud du borderlayout. Si tu met directement le bouton au sud, c'est lui qui représentera TOUTE la partie au sud, normal donc qu'il prenne la largeur de la fenêtre. Tandis que si tu met au panel au sud, que tu applique un flowlayout, et que tu y place tes boutons, ils auront une taille normale.

    Idem avec un gridlayout, tu a beau spécifier la taille de tes boutons 36 fois si tu veux, le bouton prendra toujours la taille d'un carré de la grille. Car ce layout est programmé pour preprésenter une grille dont tous les éléments ont la même taille.

    Selon le type de layout, il va prendre en compte ou pas la taille préférée d'un composant.

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Les layouts prennent en charge le placement et le redimensionnement des composants. Lorsque l'utilisateur change la taille de la fenêtre, le layout s'assure que tout se comporte (plus ou moins) correctement. En utilisant des coordonnées absolues... Un excellent compromis entre les deux est le nouveau GroupLayout, disponible sous forme de bibliothèque ou dans le JDK 1.6. Il fait partie du nouveau designer appelé Matisse dans NetBeans 5. Je te conseille *vivement* de l'essayer.
    Romain Guy
    Android - Mon livre - Mon blog

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Gfx
    Les layouts prennent en charge le placement et le redimensionnement des composants. Lorsque l'utilisateur change la taille de la fenêtre, le layout s'assure que tout se comporte (plus ou moins) correctement. En utilisant des coordonnées absolues... Un excellent compromis entre les deux est le nouveau GroupLayout, disponible sous forme de bibliothèque ou dans le JDK 1.6. Il fait partie du nouveau designer appelé Matisse dans NetBeans 5. Je te conseille *vivement* de l'essayer.
    Génial, c'est moins chiant que le SpringLayout pour faire des "formulaires" apparemment ;-) (d'après ce que j'ai vu dans la doc)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 58
    Points
    58
    Par défaut
    Merci à tous pour ces éclaircissements.
    J'ai passé ma journée à tester les différents layout ; et celui pour lequel j'ai finalement opté est le GridBagLayout. Par contre j'ai l'impression d'avoir du un peu bidouiller pour réussir ce que je voulais faire.
    En fait je voulais faire deux composants ; une table de jeu au nord appelée maTable:



    Et une bande en bas appelée mesActions dans laquelle sont implantés les boutons d'action (hit , stand, etc) :




    cependant si je fais :

    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
     
        layout = new GridBagLayout();
        c.setLayout(layout);     
        GridBagConstraints cs = new GridBagConstraints();
     
                cs.fill = GridBagConstraints.HORIZONTAL;
     
                cs.weighty = 1;
                cs.weightx = 1;
                cs.gridx = 0;
                cs.gridy = 0;
                c.add(maTable,cs);
     
     
                cs.weightx = 1;
                cs.weighty = 1;
                cs.gridx = 0;
                cs.gridy = 1; 
                c.add(mesActions,cs);
    Je me retrouve avec le résultat suivant :



    Alors j'introduis une possibilité de déformation verticale avec des cs.ipady différents pour mes deux composants.
    Et la je cherche pas à pas (c'est laborieux) jusqu'à arriver au résultat voulu pour ipady = 510 pour la table et 100 pour la bande du bas :



    Il doit y avoir plus simple pour avoir un raccord parfait sans y passer la nuit non?

  10. #10
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Essaye ce code plutot, ca devrait faire ce que tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    layout = new GridBagLayout();
    c.setLayout(layout);     
    GridBagConstraints cs = new GridBagConstraints();
     
    cs.fill = GridBagConstraints.BOTH;
    cs.gridwidth = GridBagConstraints.REMAINDER
     
    c.add(maTable,cs);
     
    c.add(mesActions,cs);
    Comme tu le dis si bien pourquoi faire complique.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 68
    Points : 58
    Points
    58
    Par défaut
    Ca a l'air de marcher !

    Merci

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

Discussions similaires

  1. Horaires : Pourquoi faire plus de 35h par semaines ?
    Par the_ugly dans le forum Emploi
    Réponses: 112
    Dernier message: 16/07/2009, 17h55
  2. Pourquoi faire simple
    Par onet dans le forum Enigmes
    Réponses: 4
    Dernier message: 29/01/2007, 12h40
  3. pourquoi faire un war de mon application web?
    Par rvfranck dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 04/10/2006, 18h49
  4. [Debat]case sensitive : pourquoi faire ?
    Par Rincevent76 dans le forum Langage
    Réponses: 53
    Dernier message: 24/04/2006, 10h14
  5. [D7] MySQL Embedded avec Delphi, pourquoi faire?
    Par raoulmania dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2005, 16h25

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