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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é

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