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

 Java Discussion :

Débutante : Problème Layout


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 148
    Par défaut Débutante : Problème Layout
    Salut à tous,

    Je m'arrache les cheveux pour comprendre les layouts et je n'arrive pas à faire des choses toutes simples, sans aucun doute par manque de connaissances.
    J'ai beau lire des tutos et autres cours, j'ai besoin de poser des questions pour comprendre.

    J'essaie désespérément de créer une fenêtre dans laquelle, en plein centre, je souhaite demander à l'utilisateur son login et son mot de passe. Pour l'instant, je ne m'occupe que de l'aspect visuel de la fenêtre. Je veux donc 2 "lignes" contenant chacune un label et un champ de saisie, l'une au dessus de l'autre bien sûr, et l'ensemble des composants doit être centré dans la fenêtre. Visuellement, je veux avoir quelque chose qui ressemble à ça (cf PJ n°1).
    Mon problème, c'est que je ne comprends pas pourquoi j'obtiens ça (cf PJ n°2).

    Voici le code de la classe Identification (soyez indulgents, je débute :p ) :
    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
    import javax.swing.JFrame;
    import javax.swing.Box;
    import javax.swing.JLabel;
    import javax.swing.JPasswordField;
     
    public class Identification extends JFrame
    {
    	/////////////////////////////
    	//Déclaration des variables//
    	/////////////////////////////
     
    	//Conteneurs
    	private  Box box1 = Box.createHorizontalBox();
    	private  Box box2 = Box.createHorizontalBox();
    	private  Box box3 = Box.createVerticalBox();
     
    	//Composants à inclure
    	private JLabel labelId = new JLabel("Identifiant: ");
    	private JLabel labelMdp = new JLabel("Mot de passe : ");
    	private JPasswordField saisieId = new JPasswordField();
    	private JPasswordField saisieMdp = new JPasswordField();
     
    	//Constructeur
    	public Identification()
    	{
    		box1.add(labelId);
    		box1.add(saisieId);
    		box2.add(labelMdp);
    		box2.add(saisieMdp);
    		box3.add(box1);
    		box3.add(box2);
     
    		//Définition des attributs de la fenêtre
    		this.setTitle("Identification");
    		this.setSize(700,450);
    		this.setContentPane(box3);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
    }
    Et le code de la classe Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Main
    {
    	public static void main(String[] args)
    	{
    		Identification identification = new Identification();
    	}
    }
    Quelqu'un peut-il m'expliquer ce qui ne va pas ? Merci beaucoup.
    Images attachées Images attachées   

  2. #2
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pour le désalignement, le problème viens du fait que tu utilise deux BoxLayout, donc chaque "ligne" a un layout indépendant -> pas d'alignement vertical possible. Donc mauvais choix de layout. La taille énorme du truc viens du fait que le boxlayout fait ajuster le composant à la taille du conteneur, donc pas dans sa taille naturelle.


    Pour un layout en grille comme tu le demande, tu as le choix

    1) un Gridlayout, mais pas hyper génial dans ton besoin, car le textfield et le label auront d'office la même largeur

    2) un gridbaglayout, plus complexe à mettre en oeuvre, mais tu pourra alors jouer sur le fill, les marges etc pour obtenir ce que tu veux (désolé, je suis trop fainéant pour te faire le code y a plein d'exemples sur le net )

    3) un springlayout, peux arriver au même résultat, mais vu la complexité peut être un peu de l'overkill par rapport au besoin

    4) un Grouplayout, même remarque que pour spring


    ma préférence allant nettement pour commencer au gridbaglayout puis au springlayout.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Je suis d'accord avec tchize_, le GridBagLayout est tout à fait adapté à ce genre de chose.
    Un petit 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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    package test;
     
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
     
    public class TestGridBagLayoutLogin {
     
        private JFrame fenetre;
        private GridBagLayout layout;
        private GridBagConstraints constraints;
     
        private JLabel labelLogin;
        private JTextField login;
     
        private JLabel labelPassword;
        private JTextField password;
     
        public void initAndDisplay() {
    	fenetre = new JFrame();
    	layout = new GridBagLayout();
    	constraints = new GridBagConstraints();
     
    	fenetre.getContentPane().setLayout(layout);
     
    	labelLogin = new JLabel("Login : ");
    	login = new JTextField(20);
    	labelPassword = new JLabel("Password : ");
    	password = new JTextField(20);
     
    	constraints.gridx = 0;
    	constraints.gridy = 0;
    	constraints.anchor = GridBagConstraints.WEST;
    	fenetre.getContentPane().add(labelLogin, constraints);
     
    	constraints.gridx = 1;
    	fenetre.getContentPane().add(login, constraints);
     
    	constraints.gridx = 0;
    	constraints.gridy = 1;
    	fenetre.getContentPane().add(labelPassword, constraints);
     
    	constraints.gridx = 1;
    	fenetre.getContentPane().add(password, constraints);
     
    	fenetre.setTitle("Login");
    	fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	fenetre.pack();
    	fenetre.setVisible(true);
        }
     
        public static void main(String[] args) {
    	SwingUtilities.invokeLater(new Runnable() {
    	   public void run() {
    	       TestGridBagLayoutLogin app = new TestGridBagLayoutLogin();
    	       app.initAndDisplay();
    	   }
    	});
        }
     
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 148
    Par défaut
    Merci à vous 2 pour vos réponses. J'ai à peu près tout compris, tout va bien de ce côté-là.

    La taille énorme du truc viens du fait que le boxlayout fait ajuster le composant à la taille du conteneur, donc pas dans sa taille naturelle.
    Comment sais-tu cela ? Où peut-on se renseigner sur les particularités de chacun des différents layouts, c'est-à-dire leur façon d'ajuster les composants (taille des composants modifiée ou non par exemple) afin de bien choisir le layout et de ne pas avoir de surprise en codant ?
    Merci.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 148
    Par défaut
    Problème résolu.
    Voici mon code pour la classe Identification :

    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
    import java.awt.GridBagLayout;
    import java.awt.GridBagConstraints;
    import java.awt.Insets;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPasswordField;
    import javax.swing.SwingConstants;
     
     
    public class Identification extends JFrame
    {
    	/////////////////////////////
    	//Déclaration des variables//
    	/////////////////////////////
     
    	//Composants à inclure
    	private JLabel labelId = new JLabel("Identifiant : ");
    	private JLabel labelMdp = new JLabel("Mot de passe : ");
    	private JPasswordField saisieId = new JPasswordField();
    	private JPasswordField saisieMdp = new JPasswordField();
     
    	//Autres variables
    	private GridBagLayout layout = new GridBagLayout();
    	private GridBagConstraints constraints = new GridBagConstraints();
     
    	//Constructeur
    	public Identification()
    	{
    		//Placement du texte dans les étiquettes
    		labelId.setHorizontalAlignment(SwingConstants.LEFT);
    		labelMdp.setHorizontalAlignment(SwingConstants.LEFT);
     
    		//Initialisation de la taille des composants
    		labelId.setPreferredSize(labelMdp.getPreferredSize());
    		saisieId.setPreferredSize(new Dimension(150,20));
    		saisieMdp.setPreferredSize(new Dimension(150,20));
     
    		//Définition du layout du conteneur principal de la fenêtre
    		this.getContentPane().setLayout(layout);
     
    		//Insertion de l'étiquette "Identifiant :" dans le conteneur
    		constraints.gridx = 0;
    		constraints.gridy = 0;
    		constraints.anchor = GridBagConstraints.LAST_LINE_END;
    		constraints.weightx = 1;
    		constraints.weighty = 1;
    		constraints.insets = new Insets(0,0,1,2);
     
    		this.getContentPane().add(labelId, constraints);
     
    		//Insertion de l'étiquette "Mot de passe :" dans le conteneur
    		constraints.gridy = 1;
    		constraints.anchor = GridBagConstraints.FIRST_LINE_END;
    		constraints.insets = new Insets(1,0,0,2);
    		this.getContentPane().add(labelMdp, constraints);
     
    		//Insertion du champ de saisie de l'identifiant dans le conteneur
    		constraints.gridx = 1;
    		constraints.gridy = 0;
    		constraints.anchor = GridBagConstraints.LAST_LINE_START;
    		constraints.insets = new Insets(0,2,1,0);
    		this.getContentPane().add(saisieId,constraints);
     
    		//Insertion du champ de saisie du mot de passe dans le conteneur
    		constraints.gridy = 1;
    		constraints.anchor = GridBagConstraints.FIRST_LINE_START;
    		constraints.insets = new Insets(1,2,0,0);
    		this.getContentPane().add(saisieMdp,constraints);
     
    		//Définition des attributs de la fenêtre
    		this.setTitle("Identification");
    		this.setSize(400,250);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
    }
    En espérant aider d'autres personnes ...

  6. #6
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Shankara Voir le message
    Où peut-on se renseigner sur les particularités de chacun des différents layouts
    http://java.sun.com/docs/books/tutor...out/index.html

    ainsi que dans la javadoc de chaque layout (où son comportement est décrit ainsi que le fait qu'il respecte ou non le preferredSize du composant)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 148
    Par défaut
    Merci pour les infos, j'avais déjà été sur le site de Sun mais je n'ai pas dû bien lire ou bien comprendre. Je vais suivre tes liens, merci pour le tuyau. Bye.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/04/2004, 11h25
  2. [Débutant] Problème de déconnexion d'une page JSP
    Par amal9 dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 22/01/2004, 13h40
  3. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28
  4. Réponses: 11
    Dernier message: 02/09/2003, 14h20
  5. [Débutant][swt][layout]
    Par Stessy dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 28/07/2003, 18h21

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