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 :

[Swing] Problème redimensionnement d'un composant dans la surcharge de paintComponen


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut [Swing] Problème redimensionnement d'un composant dans la surcharge de paintComponen
    Bonjour,

    Je réalise une application avec une frame et un panel. Dans les panels, j'ai des composants de plusieurs types (JTextField, JTextArea, JCombobox ...)
    J'ai un composant qui doit se redimensionner en fonction de la dimension des autres.
    Pour faire cela, j'ai surchargé la fonction paintComponent et ajouter mon redimensionnement.
    Malheuresement, le redimensionnement ne se réalise pas et se fait par exemple quand on redimensionne la fenêtre.

    J'ai créé un code qui résume le problème simplement:

    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
    import java.awt.Dimension;
    import java.awt.Graphics;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class TestPaintComponent extends JPanel {
     
        private JButton but1;
        private JButton but2;
     
        public TestPaintComponent(){
            super();
     
            but1 = new JButton("Bouton 1");
            but2 = new JButton("Bouton 2");
            add(but1);
            add(but2);
     
        }
     
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
     
            //but1.setSize(new Dimension(200,200));
            but1.setPreferredSize(new Dimension(200,200));
        }
     
        public static void main(String[] args){
            JFrame frame = new JFrame();
            frame.setSize(800,600);
            frame.setContentPane(new TestPaintComponent());
            frame.setVisible(true);
        }
    }
    si on utilise la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    but1.setPreferredSize(new Dimension(200,200));
    le composant se redimensionne après le redimensionnement de la fenêtre.
    si on utilise la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    but1.setSize(new Dimension(200,200));
    , le composant se redimensionne mais chevauche le bouton 2.

    Quelqu'un a-t il une solution ?

    Merci

    Alain

  2. #2
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Pour répondre à côté de ta question je dirais que les différentes primitives de redimensionnement m'ont toujours laissé perplexe .
    Entre les setSize, setPreferedSize, setMaximumSize et setMinimumSize j'ai toujours eu des surprises.
    Les noms sont très explicites, mais les comportements parfois surprenant.
    Je crois en plus que l'odre d'appel peut avoir une influence.

    Au final, j'utilise des GridBagLayouts pour gérer tout mes petits composants et ça marche sans trop de douleur pour des résultats assez prévisibles.
    C'est un peu rugueux au départ mais on s'y fait vite.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    Merci pour ta réponse.
    En fait, même avec un layout ça marche pas:

    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
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class TestPaintComponent extends JPanel {
     
        private JButton but1;
        private JButton but2;
     
        public TestPaintComponent(){
            super();
     
            this.setLayout(new BorderLayout());
     
            but1 = new JButton("Bouton 1");
            but2 = new JButton("Bouton 2");
     
            add(but1,BorderLayout.NORTH);
            add(but2,BorderLayout.SOUTH);
     
        }
     
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
     
            but1.setPreferredSize(new Dimension(0,but2.getSize().height*2));
        }
     
        public static void main(String[] args){
            JFrame frame = new JFrame();
            frame.setSize(800,600);
            frame.setContentPane(new TestPaintComponent());
            frame.setVisible(true);
        }
    }
    Ici, la hauteur du bouton 1 est égale à 2 fois celle du bouton 2 seulement après avoir redimensionner la frame

  4. #4
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    As tu essayé d'inverser l'ordre des appels comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void paintComponent(Graphics g){
    but1.setPreferredSize(new Dimension(0,but2.getSize().height*2));
    super.paintComponent(g);
    }
    Car sinon je pense qu'il aura toujours un coup de retard!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    Oui, ça fait la même chose.

  6. #6
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Je me demande si la taille de but2 n'est justement pas recalculée dans super.paintComponent(g);

    essaye histoire d'en être sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void paintComponent(Graphics g){
    super.paintComponent(g);
    but1.setPreferredSize(new Dimension(0,but2.getSize().height*2));
    super.paintComponent(g);
    }
    et éventuellement profites en pour faire un print de la taille de but2.

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

Discussions similaires

  1. Problème de positionnement des composants dans un formulaire
    Par cyberdevelopment dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/08/2011, 10h13
  2. [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
  3. [Swing] Problème d'affichage dans un JScrollPane
    Par Adrien22 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 14h36
  4. Réponses: 3
    Dernier message: 27/03/2006, 22h53
  5. [Swing] Remplacement d'un composant dans une Frame
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 20/02/2006, 15h51

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