Probleme de JPanel au centre

Signaler
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012
-
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
-
bonjour, tous le monde
je developpe une interface graphique avec swing. j'ai voulu faire un panel nomme authentifiction qui s'affiche au centre de panel de frame.
J'ai teste ce code mais le panel autentif s'affiche selon la taille de frame pas au centre exactement?? Est ce que vous pouvez m'aidez??
voici le code:

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Main {
    private JFrame cadre;
    private JPanel pane,pane_authentif;
    private JButton bouton_connexion;

    public Main()
    {
        cadre = new JFrame(" test ");
        cadre.setSize(600,400);
           
        pane = new JPanel (new BorderLayout());
        pane_authentif = new JPanel ();
        pane_authentif.setBorder(new TitledBorder("Authentification"));
        pane_authentif.setSize(200, 200);
        pane_authentif.setLocation(200, 200);
       
        bouton_connexion  =new JButton("Entrer");
        bouton_connexion .setSelected(true);
       
        pane_authentif.add(bouton_connexion);
        pane.add(pane_authentif,BorderLayout.CENTER);
       
        cadre.getContentPane().add(pane);
        cadre.setVisible(true);
    }
    public static void main(String[] args) {
            Main T=new Main();
    }
}

Merci beaucoup

28 réponses

Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

déjà pour commencer si tu utilises les Layout oublie les méthodes setLocation et setSize (ref : 1), limite tu peux utiliser la méthode setPreferredSize, ensuite par défaut si tu ne change pas le Layout d'un JPanel celui-ci prend la valeur FlowLayout (à l'exception près du ContentPane)

1 :
pane_authentif.setSize(200, 200);
pane_authentif.setLocation(200, 200);

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Moi personnellement, je trouve qu'il y a un panel en trop.
J'aurais fait comme ça :

    public Main()
    {
        cadre = new JFrame(" test ");
        cadre.setSize(600,400);
        cadre.setLayout(new FlowLayout());
          
        pane_authentif = new JPanel ();
        pane_authentif.setPreferredSize(new Dimension(200,200));
        pane_authentif.setBorder(new TitledBorder("Authentification"));
      
        bouton_connexion  =new JButton("Entrer");
        bouton_connexion .setSelected(true);
      
        pane_authentif.add(bouton_connexion);
      
        cadre.getContentPane().add(pane_authentif);
        cadre.setVisible(true);
    }
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

merci j'ai dvoraky,
j'ai change dans mon code, j'ai enlever .setSize et .setLocation et j'ai met le     pane_authentif.setPreferredSize(new Dimension(100,100));
   
Mais toujours ce panel s'affiche sur tous la taille de la frame pas rellement au centre!!!
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,
tu fais
pane = new JPanel (new BorderLayout());
....
pane.add(pane_authentif,BorderLayout.CENTER);

donc je trouve que le comportement de ton code est logique.... maintenant si tu ne le veux pas étiré sur toute la fenetre change de layout.....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Moi ça marche sans problème. Bien centré, en ne prenant que la place indiquée.
Je dois avouer que je ne suis pas trop BorderLayout, aors dès que je peux éviter, ben je l'évite...
Voilà tu es donc arrivé à tes fins.
Maintenant rajoutes moi une joli action de connexion à ce bouton "Entrer"
+
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

 Mon code contient:
 pane = new JPanel (new BorderLayout());

 pane.add(pane_authentif,BorderLayout.CENTER);
Mais il ne s'affiche pas au centre c'est sa le probleme,..


vous avez dit "maintenant si tu ne le veux pas étiré sur toute la fenetre change de layout....."

Quel layout?? j'utilise BoxLayout,FlowLayout????
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Regarde mon code... J'ai viré pane et franchement JE trouve que c'est mieux. Maintenant, c'est un JE donc voilou à prendre avec des pincettes.
+
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

Le code  de dvoraky est juste mais j'ai voulu utiliser deux panel:
 Le premier contient une image et dans son centre je met le panel authentif.
Je veux qu'il s'affiche comme le resultat de l'execution de code que vous avez mis mais comment je peux mettre l'image en arrirere plan je dois avoir un panel!!!n'est ce pas??
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

nan pas obligé tu peux utiliser un JLabel (exemple avec le code de dvoraky)

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class Main {
    public Main() {
        JFrame  cadre = new JFrame(" test ");
        cadre.setSize(600,400);
        cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        <strike> //cadre.setLayout(new FlowLayout()); </strike>
         
        JPanel pane_authentif = new JPanel ();
        pane_authentif.setPreferredSize(new Dimension(200,200));
        pane_authentif.setBorder(new TitledBorder("Authentification"));
        pane_authentif.setOpaque(false);//important sinon tu ne verras pas l'image
     
        JButton bouton_connexion  =new JButton("Entrer");
        bouton_connexion .setSelected(true);
        pane_authentif.add(bouton_connexion);
       
        JLabel contentPane = new JLabel(new ImageIcon("logo.png"));
        contentPane.setLayout(new FlowLayout());
        contentPane.add(pane_authentif);
       
        cadre.setContentPane(contentPane);
        cadre.setVisible(true);
    }
   
    public static void main(String[] args) {
        new Main();
    }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Ok je comprend mieux.
Ben en fait c'est pas plus compliqué... Ton "pane" au lieu de le mettre en BorderLayout, tu le mets en FlowLayout et ... tada!!! c'est au milieu.
Voilou
+
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Suis les conseils de Twinuts et oublie le mien là
Tu vois, alias100, j'aurais moi aussi appris avec ton post! Je ne savais pas qu'on pouvait faire ça avec un JLabel.
Encore une fois merci Twinuts
+
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

ba de rien :) et pour info tu peux meme mettre un bouton dans un bouton.....

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JFrame {

    public Test() {
       
        setSize(300, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        JPanel p = (JPanel)getContentPane();
       
        JButton bt1 = new JButton("Bouton 1");
        JButton bt2 = new JButton("Bouton 2");
       
        bt1.add(bt2);
       
        p.add(bt1);
        setVisible(true);
    }
   
    public static void main(String[] args) {
        new Test();
    }
}

je te laisse imaginer les ihm bien tordu que tu peux faire en java ^^

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
Ah ouais! Alias100 pour pane_authentif au lieu de faire avec un JPanel, je le ferais en JButton pour voir!
^^
Tiens je vais voir ce que ca donne...euh... lol?
Quand tu dis IHM tordue, c'est même plus que tordu
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
744
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
9 mai 2010
8
public class Main extends JFrame
{
    private static int nbBouton = 25;
    public Main()
    {
        this.setBounds(50, 50, 600, 400);
        this.setTitle("La pyramide des boutons");
        this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        JButton [] boutons = new JButton[nbBouton];
   
        for (int i = 0; i < nbBouton; i++)
        {
            boutons[i] = new JButton();
        }
       
        for (int i = 0; i < nbBouton-1; i++)
        {
            boutons[i].add(boutons[i+1]);
        }
       
        this.getContentPane().add(boutons[0]);
        this.setVisible(true);
        this.pack();
    }
  
    public static void main(String[] args) {
        new Main();
    }
}

... désolé ...
<hr size="2" width="100%" />C'est après des heures de codage que j'ai compris pourquoi les mecs de Java ont choisi une tasse de café comme logo!
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
lol

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

bonjour twinuts, merci pour votre aide, j'ai pris votre code et j'ai creer mon propre panel:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class test {
    public test() {
        JFrame  cadre = new JFrame(" test ");
        cadre.setSize(600,400);
        cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //cadre.setLayout(new FlowLayout());
        
        JPanel pane_authentif = new JPanel ();
        pane_authentif.setPreferredSize(new Dimension(200,200));
        pane_authentif.setBorder(new TitledBorder("Authentification"));
        pane_authentif.setOpaque(true);//important sinon tu ne verras pas l'image
       
        JButton bouton_connexion  =new JButton("Entrer");
        JTextField T=new JTextField(12);
        JLabel L=new JLabel("login");
        bouton_connexion .setSelected(true);
         pane_authentif.add(L);
        pane_authentif.add(T);
       
        pane_authentif.add(bouton_connexion);
  
        pane_authentif.setLocation(400,600);
        JLabel contentPane = new JLabel(new ImageIcon("logo.jpg"));
        contentPane.setLayout(new FlowLayout());
        contentPane.add(pane_authentif);
      
        cadre.setContentPane(contentPane);
        cadre.setVisible(true);
    }
  
    public static void main(String[] args) {
        new test();
    }
}

Le probleme que le paneau s'affiche en haut pas au centre de frame j'ai utiliser pane_authentif.setLocation et pane_authentif..setBounds mais il ne change pas de place!!!
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,

joue avec les Layout

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

ici le contentPane est un label dans le quel j'ai ajoute un panel contentPane.add(pane_authentif);
Mais dans le label il n'y pas de layout,
Je crois qu'il se trouve seulement dans les panels(layouts).
Alors comment jouer avec les Layout c'est vraiment bizarre
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
salut,

si tu as la méthode setLayout dans le jlabel....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
129
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
2 décembre 2012

voici mon nouveau code:



import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class test_{
 
    public test_() {
        JFrame  cadre = new JFrame(" test ");
        cadre.setSize(600,600);
        cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              
        JPanel pane_authentif = new JPanel ();
        pane_authentif.setBorder(new TitledBorder("Authentification"));
        pane_authentif.setOpaque(true);
        
        JButton bouton_connexion  =new JButton("Entrer");
        bouton_connexion .setSelected(true);
        JTextField T=new JTextField(12);
        JLabel L=new JLabel("login");
               
        pane_authentif.add(L);
        pane_authentif.add(T);
        pane_authentif.add(bouton_connexion);
   
 
        JLabel contentPane = new JLabel(new ImageIcon("logo.jpg"));
       
        
        contentPane.setLayout(new BorderLayout());
        contentPane.add(pane_authentif,BorderLayout.CENTER);
       
        cadre.setContentPane(contentPane);
     
        cadre.setVisible(true);
    }
   
    public static void main(String[] args) {
        new test();
    }
}

mais encore le panel n'est pas au centre.Merci!!