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 :

Probleme de Layout / ajout de composants à partir d'une autre classe.


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut Probleme de Layout / ajout de composants à partir d'une autre classe.
    Dans une class Window (héritée de JFrame) j'ai un JPanel (nommé southPanel) en public static avec un FlowLayout.
    Si j'ajoute un JLabel Label1 dans ce JPanel à partir de la classe Window, il se placera bien centré horizontalement dans ce JPanel selon le Layout.
    Par contre si j'ajoute un JLabel dans le southPanel à partir d'une autre classe (je fais donc Window.southPanel.add(new JLabel("Toto")), il se place tout à gauche de mon JPanel southPanel sans tenir compte du FlowLayout.
    Quelqu'un sait il pourquoi et comment résoudre ce problème?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut
    Citation Envoyé par ehochedez Voir le message
    Dans une class Window (héritée de JFrame) j'ai un JPanel (nommé southPanel) en public static avec un FlowLayout.
    Si j'ajoute un JLabel Label1 dans ce JPanel à partir de la classe Window, il se placera bien centré horizontalement dans ce JPanel selon le Layout.
    Par contre si j'ajoute un JLabel dans le southPanel à partir d'une autre classe (je fais donc Window.southPanel.add(new JLabel("Toto")), il se place tout à gauche de mon JPanel southPanel sans tenir compte du FlowLayout.
    Quelqu'un sait il pourquoi et comment résoudre ce problème?
    un bout de code ?

    es-tu sûr que le FlowLayout est bien "sur" le Panel ?

    as-tu bien mis dans la classe southpanel un this.setLayout(new FlowLayout()) ?

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Oui le FlowLayout est bien sur le panel puisque quand je rajoute un JLabel à partir de la classe Window, celui-ci se centre bien par défaut dans le southPanel.

    J'utilise NetBeans pour développer, j'ai bien indiqué que le souhPanel devait être en FlowLayout mais dans le code il ne l'affiche pas, c'est je pense parce que par défaut les Layout sous NetBeans sont en FlowLayout.

    Je joins le code

    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
    // Class Window un peu raccourcie
    public class Window extends javax.swing.JFrame {
     
     
        public Window() {
            initComponents();
        }
     
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            containerPanel = new javax.swing.JPanel();
            southPanel = new javax.swing.JPanel();
            jLabel1 = new javax.swing.JLabel();
            northPanel = new javax.swing.JPanel();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setResizable(false);
            setUndecorated(true);
     
            getContentPane().setLayout(null);
     
            containerPanel.setBackground(new java.awt.Color(231, 221, 221));
            containerPanel.setLayout(null);
     
            southPanel.setBackground(new java.awt.Color(204, 204, 255));
            southPanel.setPreferredSize(null);
            southPanel.setLayout(new java.awt.FlowLayout()); (il n'y est pas par défaut mais je l'ai rajouté, même avec ça ça ne marche pas..)
     
            jLabel1.setText("jLabel1");
            southPanel.add(jLabel1);
     
            containerPanel.add(southPanel);
            southPanel.setBounds(0, 723, 1024, 45);
     
            containerPanel.add(northPanel);
            northPanel.setBounds(0, 0, 1024, 45);
     
            getContentPane().add(containerPanel);
            containerPanel.setBounds(0, 0, 1024, 768);
     
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-1024)/2, (screenSize.height-768)/2, 1024, 768);
        }// </editor-fold>
     
     
     
        // Variables declaration - do not modify
        public static javax.swing.JPanel containerPanel;
        private javax.swing.JLabel jLabel1;
        public static javax.swing.JPanel northPanel;
        public static javax.swing.JPanel southPanel;
        // End of variables declaration
     
    }
    ////////////////////////////////////////////////////

    et dans la classe InstantProfilePanel j'ai ce morceau de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    jLabel2 = new javax.swing.JLabel();
    jLabel2.setText("jLabel1");
    Window.southPanel.add(jLabel2);
    jLabel2.setSize(80,40);
    Window.southPanel.repaint();
    Donc je résume, mon jLabel1 s'affiche bien au milieu de mon southPanel, mais le jLabel2 s'affiche tout à gauche. Et si je ne précise pas sa taille avec jLabel2.setSize(80,40); alors il ne s'affiche pas du tout.. bizarre.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut
    j'ai jeté un oeil sur ton code mais je ne pige pas comment tu te sers de la classe InstantProfilePanel ?

    de plus il y a un getContentPane().setLayout(null); qui me chiffonne

    est-ce utile

    un bout de code que j'ai essayé mais je ne sais pas si c'st ce que tu veux faire ?

    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
     
    public class Fenetre extends JFrame
    {
        // ............... serialVersionUID ...................................
        private static final long serialVersionUID = 1L;
        public JComponent contenu = null;
        public JPanel southPanel = new JPanel();
        // --------------------------------------------------------------------    
        JButton LabDroit = new JButton("DROIT");
        JTextField etatG = new JTextField(30);
        // --------------------------------------------------------------------    
        public Fenetre(String title, int larg, int haut)
        {
    	this.setTitle(title);
    	this.setSize(larg, haut);
    	contenu = (JComponent) this.getContentPane();
    	// --------------------------------------------------------------------    
    	southPanel.setLayout(new FlowLayout());
    	southPanel.setPreferredSize(new Dimension(1000, 76));
    	southPanel.setMaximumSize(new Dimension(1000, 76));
    	southPanel.setBackground(new java.awt.Color(204, 204, 255));
    	southPanel.add(LabDroit);
    	southPanel.add(etatG);
    	// -------------------------------------------------------------------- 
    	this.add(southPanel);
        }
    }
    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
    public class Main
    {
        private static final long serialVersionUID = 4648172894076113183L;
        // --------------------------------------------------------------------    
        private static final int Larg = 320;
        private static final int Haut = 240;
        private static final String Titre = "Ma premiere fenetre";
        // --------------------------------------------------------------------    
        static JLabel label1 = new JLabel("CENTRE");
       /**
        	@param args
         */
        public static void main(String[] args) 
        {
    	Fenetre fen = new Fenetre(Titre, Larg, Haut);
    	fen.setResizable(true);
    	fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	fen.setLocationRelativeTo(null);
    	fen.setVisible(true);
    	// --------------------------------------------------------------------    
    	fen.southPanel.add(label1);
        }
    }
    et ça ça fonctionne

  5. #5
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Désolé Quadra j'ai été un peu long à répondre mais c'est parce que je voulais être un peu plus clair.
    J'ai construit un exemple à échelle réduit reproduisant le même problème.

    je joins le code de mes 3 classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Classe Main ---------------------------------------------
    package test;
     
    public class Main {
     
        public static void main(String[] args) {
            Fenetre fen = new Fenetre();
            fen.show();
        }
     
    }




    // Classe Fenetre ------------------------------------------
    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
    package test;
     
    import javax.swing.JLabel;
     
    public class Fenetre extends javax.swing.JFrame {
     
        public Fenetre() {
            initComponents();
            JLabel jLabel1 = new JLabel("Fenetre");
            staticPanel.add(jLabel1);
        }
     
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            container = new javax.swing.JPanel();
            staticPanel = new javax.swing.JPanel();
            panneau0 = new javax.swing.JPanel();
            goPanneau1 = new javax.swing.JButton();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
     
            container.setPreferredSize(new java.awt.Dimension(600, 400));
            container.setLayout(null);
     
            staticPanel.setBackground(new java.awt.Color(204, 204, 255));
            container.add(staticPanel);
            staticPanel.setBounds(30, 180, 530, 130);
     
            panneau0.setBackground(new java.awt.Color(204, 255, 204));
            panneau0.setLayout(null);
     
            goPanneau1.setText("Go Panneau 1");
            goPanneau1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    goPanneau1ActionPerformed(evt);
                }
            });
            panneau0.add(goPanneau1);
            goPanneau1.setBounds(210, 60, 99, 23);
     
            container.add(panneau0);
            panneau0.setBounds(0, 0, 600, 150);
     
            getContentPane().add(container);
            container.setBounds(0, 0, 600, 400);
     
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-600)/2, (screenSize.height-400)/2, 600, 400);
        }// </editor-fold>
     
        private void goPanneau1ActionPerformed(java.awt.event.ActionEvent evt) {
            Panneau1 currentPanel = new Panneau1();
            Fenetre.container.add(currentPanel);
            Fenetre.container.remove(panneau0);
            currentPanel.setBounds(0,0,600,150);
        }
     
        // Variables declaration - do not modify
        public static javax.swing.JPanel container;
        private javax.swing.JButton goPanneau1;
        private javax.swing.JPanel panneau0;
        public static javax.swing.JPanel staticPanel;
        // End of variables declaration
     
    }
    --------------------------------------------------------

    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
    // Classe Panneau1--------------------------------------
    package test;
     
    import javax.swing.JLabel;
     
    public class Panneau1 extends javax.swing.JPanel {
     
        public Panneau1() {
            initComponents();
     
            JLabel jLabel2 = new javax.swing.JLabel();
            jLabel2.setText("LALALA");
            Fenetre.staticPanel.add(jLabel2);
            jLabel2.setSize(100,30);
        }
     
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            setBackground(new java.awt.Color(204, 255, 204));
            setPreferredSize(new java.awt.Dimension(600, 150));
            setLayout(null);
     
        }// </editor-fold>
     
        // Variables declaration - do not modify
        private javax.swing.JButton goPanneau2;
        // End of variables declaration
     
    }
    ------------------------------------------------------


    le jLabel1 s'affiche bien centré dans le staticPanel mais pas le jLabel2 (une fois cliqué sur le bouton). Sais tu pourquoi?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut
    apparemment

    [ non je n'ai pas cherché toute la nuit ]

    il s'agit d'un probleme de rafraichissement du panel

    si tu mets ta fenetre en resizable et que tu la redimensionnes d'un poil le JLabel se met au bon endroit !!

    faut creuser de ce coté

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut
    déjà en ajoutant setVisible(true) le JLabel se place bien

    reste la "suppression" du panneau0 qui ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        private void goPanneau1ActionPerformed(java.awt.event.ActionEvent evt) 
        {
            Panneau1 currentPanel = new Panneau1();
            Fenetre.container.add(currentPanel);
            Fenetre.staticPanel.add(new JButton("TEST"));
            Fenetre.container.remove(panneau0);
            this.setVisible(true);
        }
    quelle version de Java utilises-tu ?

    je vois des fonctions qui n'existent plus sur la mienne (Java6) comme show() ou que tu n'utilises pas comme : setLocationRelativeTo(null);

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut
    LA solution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        private void goPanneau1ActionPerformed(java.awt.event.ActionEvent evt) 
        {
    	Panneau1 currentPanel = new Panneau1();
            Fenetre.container.add(currentPanel);
            Fenetre.container.remove(panneau0);
            this.pack();
        }
    en espérant que ça fonctionne sur ta version de Java

  9. #9
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Ah ah moi je suis pas loin d'avoir passé la nuit sur le problème.. et plus je cerne le problème, plus je trouve ça bizarre.
    Par exemple si je met la partie de code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Panneau1 currentPanel = new Panneau1();
    Fenetre.container.remove(panneau0);
    currentPanel.setBounds(0,0,600,150);
    this.setVisible(true);
    dans le constructeur de Fenetre, il change directement le panneau0 en panneau1 et le jLabel2 s'affichera bien centré.. alors que c'est exactement la même chose que l'on fait.. sauf que l'on passe pas par un bouton.

    Enfin bref tu as raison c'est visiblement un problème de rafraichissement. Quand je redimenssionne ma fenetre, tout se remet en place au bon endroit.
    Et quand j'utilise le this.setVisible(true) cela marche aussi.
    Sauf que dans mon application originale je peux pas mettre this.setVisible(true) car je me déplace dans plusieurs fenetres et que je veux pouvoir ajouter des elements dans le staticPanel au fil de mon parcours. Donc il faudrait que je puisse ecrire Fenetre.setVisible(true) mais ce n'est pas autorisé car la méthode n'est pas public.

    En gros ça reviens au problème suivant : si maintenant qu'on a le panneau1 qui s'affiche on veut cliquer sur un bouton du panneau1 pour afficher le panneau2 à la place du panneau1 et ajouter à nouveau un jLabel dans le staticPanel, il sera impossible de mettre this.setVisible(true) puisque le code sera à écrire dans la classe panneau1. Il faudrait donc écrire Fenetre.setVisible(true) mais c'est interdit.. Ou alors creer une méthode de la classe Fenetre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static Refresh(){
      this.setVisible(true)
    }
    mais il ne veut pas parce que fenetre n'est pas en static...

    Tu as en tout cas beaucoup mieux avancé que moi sur la question, merci..

    Pour info j'utilise la dernière version de Java, je ne comprenais pas pourquoi il me barrait le .show() dans netbeans, maintenant je sais que c'est parce que cette methone n'est plus utilisée . Il faut mettre .setVisible(true) à la place c'est ça?

  10. #10
    Membre averti
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Bon ça y est le problème est réglé, il suffisait simplement d'utiliser un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fenetre.staticPanel.revalidate();
    après l'ajout du jLabel2.

    Beaucoup de tracas pour pas grand chose..

    Merci beaucoup à toi en tout cas Quadra..

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Par défaut


    cool

    je note cette fonction pour "au cas où"

    merci d'avoir donné la solution

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/01/2015, 10h13
  2. [XL-2010] Ajout de données à partir d'une autre feuille
    Par Dubbleu dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/08/2013, 16h08
  3. Modifier un composant d'une classe à partir d'une autre classe
    Par Yann_69 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 25/06/2012, 07h12
  4. appeler des composants à partir d'une autre frame
    Par lex13 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 08/07/2007, 21h00
  5. probleme ecouter un panel a partir d une autre class
    Par sneb5757 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/03/2007, 11h49

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