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

Composants Java Discussion :

Problème de placement d'un JTextField


Sujet :

Composants Java

  1. #1
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut Problème de placement d'un JTextField
    Bonjour voilà je suis en train de créer une bataille navale, j'ai créer les deux grilles mais j'ai un problème concernant le placement de 2 objets de type JTextField je n'arrive pas a les placer ou je veux dans le panneau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    super (nom);
    		setBounds(300,200,largeur,hauteur);
    		Container contenu = getContentPane();
    		panneau = new PanDes();  //instancie l'objet panneau avec PanDes
    		contenu.add(panneau);  //ajoute le composant panneau a la fenetre
     
    		saisie = new JTextField (10);
    		panneau.add(saisie);
    		saisie2 = new JTextField(10);
    		panneau.add(saisie2);
    Dans la classe PanDes il y a le code contenant le dessin des 2 grilles.
    Avec le code ci-dessus il place bien les 2 JTextField mais je ne vois pas comment les placer la ou je voudrais en entrant les coordonnées en pixels par exemple car je voudrais les placer sous les 2 grilles mais la il sont placer au dessus cela doit être un placement par défaut je suppose. J'ai essayer avec la méthode setBOunds appliqué sur les JTextField mais ca ne marche pas et les différents gestionnaire de mise en forme ne propose pas un placement "libre" des composants a moins qu'il y en est un que je connais pas.
    Voici un image du projet bataille navale ca peut aider :
    Nom : bat nav.JPG
Affichages : 502
Taille : 38,2 Ko
    Merci pour votre aide.
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  2. #2
    Membre averti Avatar de welcome_59
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 203
    Points : 352
    Points
    352
    Par défaut
    Tu utilises quoi comme layout?
    SCJP 5 | CAPM

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 28
    Points : 32
    Points
    32
    Par défaut
    salut

    De mémoire, effectivement le layout de base dispose les éléments graphique au centre en fait.
    si tu veux les placer où tu veux, annule le layout via la méthode setLayout(null)
    ensuite utilise la méthode setBound() pour placer tes éléments

    dis nous ce qu'il en ait

    Matt

  4. #4
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut
    En fait je n'utilise pas de layout mais dans ce cas dois-je malgré tout mettre la méthode setLayout(null)?
    Merci
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  5. #5
    Membre du Club Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 67
    Points
    67
    Par défaut
    si tu n'as pas spécifier de Layout, tu utilises celui par défaut qui est le FlowLayout et qui ne fait pas des choses super. Je te conseille d'utiliser un GridBagLayout, c'est un peu compliqué à mettre en oeuvre si tu ne sais pas ce qu'est un layout, mais après c'est très puissant pour faire ce que tu veux.

    Par contre je ne connnais pas la méthode qui consiste a supprimer le layout, alors à toi de voir.

    en tout cas si tu veux utiliser un GridBagLayout, il faut faire comme ça :


    prenons l'exemple du cas ou tu veux placer deux JTextField dans un JPanel (nommé jPanel)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //initialisation du layout et des contraintes (constraints) qui vont te permettre de placer tes éléments
    GridBagConstraints gridBagConstraints;
    jPanel.setLayout(new GridBagLayout());
    ensuite tu places un JTextField

    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
     
    // init des nouvelles contraintes pour ton élément à placer
    gridBagConstraints = new GridBagConstraints();
    // premiere case en x
    gridBagConstraints.gridx = 0;
    // premiere case en y
    gridBagConstraints.gridy = 0;
    // ces deux contraintes sont plus dures à comprendre, elles indiquent une pondération de l'utilisation de l'espace qui reste autour des cases
    gridBagConstraints.weightx = 0.5;
    gridBagConstraints.weighty = 1;
    // met l'element au nord, mais bon a changer suivant ton cas
    // CENTER, ça peut le faire aussi
    gridBagConstraints.anchor = GridBagConstraints.NORTH;
    // ajoute l'élément à jPanel avec les contraintes
    jPanel.add(new JTextField(10),gridBagConstraints);
    ensuite le deuxième

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    gridBagConstraints = new GridBagConstraints();
    // seul changement, deuxième case en x
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    // pas besoin de spécifier la pondération en y, elle est imposée par la première case de la ligne dans notre cas
    gridBagConstraints.weightx = 0.5;
    gridBagConstraints.anchor = GridBagConstraints.NORTH;
    jPanel.add(new JTextField(10),gridBagConstraints);
    voila, en tout cas si tu veux plus de détails sur le GridBagLayout et surtout sur GridBagContraints qui permet de faire plein de placement comment tu as envie va sur l'API.

    [edit] pour bien comprendre les weight, il faut faire des exemples. SI par exemple tu veux faire trois colonnes avec la première qui fera deux fois la taille des autres. tu mets comme weightx respectivement 0.5 puis 0.25 et 0.25[/edit]

  6. #6
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut
    Pour placer 2 JTextField respectivement en bas de chaque grille il n'y a pas une solution plus simple parce que j'ai mal a comprendre le système de placement avec le GridLayout on ne peut pas tout simplement utiliser un setBounds sur les JTextField.
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 28
    Points : 32
    Points
    32
    Par défaut
    re

    normalement ta fenêtre hérite de la classe JFrame
    il te suffit de faire
    pour annuler la mise en page

    ensuite avec la méthode setBounds(..,..,..,..) tu peux placer tes JTextField où tu veux

    amicalement
    matt

  8. #8
    Membre habitué Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 134
    Points
    134
    Par défaut
    Bonjour désolé pour une réponse tardive. J'ai placer donc le setLayout a null mais quand je fait ca rien ne s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		super (nom);
    		setBounds(300,200,largeur,hauteur);
    		Container contenu = getContentPane();
    		this.setLayout(null);
    		panneau = new PanDes();  
    		contenu.add(panneau);  
     
    		saisie = new JTextField (10);
    		saisie.setBounds(20,20,30,40);
    		panneau.add(saisie);
    		saisie2 = new JTextField(10);
    		saisie2.setBounds(50,50,60,70);
    		panneau.add(saisie2);
    La classe PanDes herite de JFrame et c'est cette classe qui dessine les 2 grilles.

    Avec ce code rien ne s'affiche juste une fenêtre "vide". Ne faudrait-il pas que je mette le code du dessin des 2 grilles directement dans le code du constructeur ci-dessus?
    Merci.
    Les élèves glandeurs c'est comme le linge, quand il fait beau ca sèche.

  9. #9
    Membre régulier Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    supprimer le Layout n'est pas vraiment la meilleure solution car cela interdit tout redimensionnement de ta fenêtre. L'intérêt d'utiliser un Layout c'est qu'il va faire le boulot à ta place.
    Le FlowLayout n'est effectivement pas le plus indiqué car il positionne les éléments les uns après les autres. Tu devrais pouvoir utiliser un BorderLayout avec un JPanel intermédaire pour contenir tes 2 JTextField
    Pourquoi PanDes herite de JFrame ? Si tu veux le mettre avec d'autre truc dans une JFrame il faut peut etre mieux qu'il hérite de JPanel. et la JFrame est ta classe contenant le main. Voici comment je verrais la chose avec PanDes qui hérite de JPanel

    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
     
    public class BatailleNavale extends JFrame {
     
    public BatailleNavale(){
       super("Bataille navale");
       Container contenu = getContentPane();
       contenu.setLayout(new BorderLayout());
       //le BorderLayout a 5 zones : le centre, le nord(en haut), le sud, l'est(a droite) et l'ouest
       PanDes panneau = new PanDes();  
       contenu.add(panneau,BorderLayout.CENTER);// BorderLayout.CENTER indique qu'on le met au milieu
     
       JPanel unPetitPanneau = new JPanel();
       unPetitPanneau.setLayout(new BorderLayout());
     
       JTextField saisie = new JTextField (10);
       unPetitPanneau.add(saisie,BorderLayout.WEST);//on le met a gauche du petit panneau
     
       JTextField saisie2 = new JTextField(10);
       unPetitPanneau.add(saisie2,BorderLayout.EAST);//on le met a droite du petit panneau
     
       contenu.add(unPetitPanneau,BorderLayout.SOUTH);//on met le petit panneau en bas donc sous le PanDes
       }
     
       public static void main(String[] arg) {
          BatailleNavale jeu = new BatailleNavale();
          //rajouter tous les controle que tu veux ou les mettre dans Bataille Navale
         BatailleNavale.setVisible(true);
       }
    }
    (le code est juste sauf les éventuelles erreurs de frappe )
    reste à rajouter les contrôles sur tes JTextField etc.... sur la JFrame aussi bien sur.

    En imbriquant les différents Container on arrive facilement a faire ce qu'on veut et surtout ça "tient" quand on redimensionne.

    Bon code,
    kerinel

Discussions similaires

  1. Problème de Focus sur un JTextField à l'ouverture de la fenêtre
    Par nicofromChina dans le forum Composants
    Réponses: 2
    Dernier message: 19/01/2007, 10h09
  2. problème de placement d'un lien
    Par wegreen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 27/09/2006, 12h58
  3. probléme de placement colonne droite css
    Par speedylol dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/07/2006, 09h37
  4. [Swing] Problème de placement et de taille des composants
    Par CrazySeb dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 22/04/2006, 14h56
  5. problème de placement avec IE
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2005, 23h46

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