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 :

[Debutant] Fixer la taille d'une interface graphique


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut [Debutant] Fixer la taille d'une interface graphique
    Bonjour,

    je suis confronté à un problème récurrent que je ne sais pas trop comment résoudre.

    J'ai développé une interface graphique suite à un exercice trouvé sur ce site.
    Les composants sont correctement placé comme je le souhaite, mais si la frame est redimensionné alors les composants changent de place.
    Evidemment, une solution serait d'interdire le redimmensionnement de la frame, mais cette solution ne me plaît guère.
    J'aimerais tout simplement que mon interface ne soit pas redimensionné.
    Voici 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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
     
    public class ConstraintsDefinition extends GridBagConstraints{
     
        public static final void buildConstraints(GridBagConstraints gbc,int gx,int gy,
        int gw,int gh,int wx,int wy){
            gbc.gridx=gx;
            gbc.gridy=gy;
            gbc.gridwidth=gw;
            gbc.gridheight=gh;
            gbc.weightx=wx;
            gbc.weighty=wy;
        }
    }
     
    public class GuiImpot extends JFrame {
        private JRadioButton rdOui;
        private JRadioButton rdNon;
        private JSpinner spinEnfants;
        private JTextField txtSalaire;
        private JLabel lblImpotPayer;
        private JTextField txtStatus;
     
        /** Creates a new instance of GuiImpot */
        public GuiImpot() {
            super("Calcul de l'impôt");
     
            //Gestionnaire de Mise en page
            GridBagLayout gridbag=new GridBagLayout();
            GridBagConstraints constraints=new GridBagConstraints();
     
            //Conteneur
            JPanel pane=new JPanel(gridbag);
            //pane.setPreferredSize(new Dimension(50,50));
     
            getContentPane().setLayout(new BorderLayout());
            add(pane,BorderLayout.CENTER);
     
            //Interface Graphique
            constraints.anchor=GridBagConstraints.WEST;
            //constraints.fill=GridBagConstraints.BOTH;
            Insets inset=new Insets(0,0,0,0);
            inset.set(5,5,5,5);
            constraints.insets=inset;
     
            //Question : Mariage
     
            JLabel lblMarie=new JLabel("Etes-vous marié(e) ?");
            ConstraintsDefinition.buildConstraints(constraints,0,0,1,1,30,100);
            gridbag.setConstraints(lblMarie,constraints);
            pane.add(lblMarie);
     
            rdOui=new JRadioButton("Oui");
            ConstraintsDefinition.buildConstraints(constraints,1,0,1,1,20,100);
            gridbag.setConstraints(rdOui,constraints);
            pane.add(rdOui);
     
            rdNon=new JRadioButton("Non");
            ConstraintsDefinition.buildConstraints(constraints,2,0,1,1,20,100);
            gridbag.setConstraints(rdNon,constraints);
            pane.add(rdNon);
     
            // Choix du nombres d'enfants
            JLabel lblNbEnfants=new JLabel("Nombres d'enfants");
            ConstraintsDefinition.buildConstraints(constraints,0,1,1,1,30,100);
            gridbag.setConstraints(lblNbEnfants,constraints);
            pane.add(lblNbEnfants);
     
            spinEnfants=new JSpinner(new SpinnerNumberModel(0,0,20,1));
            ConstraintsDefinition.buildConstraints(constraints,1,1,1,1,30,100);
            gridbag.setConstraints(spinEnfants,constraints);
            pane.add(spinEnfants);
     
            //Montant du salaire
            JLabel lblSalaire=new JLabel("Salaire Annuel");
            ConstraintsDefinition.buildConstraints(constraints,0,2,1,1,30,100);
            gridbag.setConstraints(lblSalaire,constraints);
            pane.add(lblSalaire);
     
            txtSalaire=new JTextField(10);
            ConstraintsDefinition.buildConstraints(constraints,1,2,2,1,30,100);
            gridbag.setConstraints(txtSalaire,constraints);
            pane.add(txtSalaire);
     
            JLabel lblSalaireF=new JLabel("F");
            ConstraintsDefinition.buildConstraints(constraints,3,2,1,1,10,100);
            gridbag.setConstraints(lblSalaireF,constraints);
            pane.add(lblSalaireF);
     
            //Montant de l'impot
            JLabel lblImpot=new JLabel("Impôt à payer");
            ConstraintsDefinition.buildConstraints(constraints,0,3,1,1,30,100);
            gridbag.setConstraints(lblImpot,constraints);
            pane.add(lblImpot);
     
            lblImpotPayer=new JLabel();
            ConstraintsDefinition.buildConstraints(constraints,1,3,2,1,30,100);
            gridbag.setConstraints(lblImpotPayer,constraints);
            pane.add(lblImpotPayer);
     
            JLabel lblImpotF=new JLabel("F");
            ConstraintsDefinition.buildConstraints(constraints,3,3,1,1,30,100);
            gridbag.setConstraints(lblImpotF,constraints);
            pane.add(lblImpotF);
     
            //Texte Status
            txtStatus=new JTextField(30);
            txtStatus.setEditable(false);
            ConstraintsDefinition.buildConstraints(constraints,0,4,4,1,30,100);
            gridbag.setConstraints(txtStatus,constraints);
            pane.add(txtStatus);
     
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            pack();
            setVisible(true);
        }
     
        public static void main(String[]args){
            new GuiImpot();
        }
    }
    Merci pour votre aide.
    ++

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Ben mis à part taFrame.setResizable(false), je vois pas trop...

    Bon tu peut aussi faire un listener sur ta frame et quand elle est redimensionné, tu lui remets la taille d'origine, mais c'est plus compliqué

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Mon problème n'est pas pour redimensionner la frame, mais le fait que les objets changent de place quand on redimensionne la frame.

    Du coup, les espaces entre les objets augmentent et ça ne fait pas très beau.

    Merci d'avance
    A+

  4. #4
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Ton problème (qui n'en est pas un d'ailleurs) est que tu utilise les layouts. Les layouts permettent de gérer la mise en forme de ton interface justement en cas de redimensionnement, en modifiant l'emplacement (voire la taille) de tes composants de manière à garder une mise en place cohérente. Le comportement que tu observe est donc normal.

    Ce que tu cherche à faire est un peu, si j'ose dire, contre la "philosophie" des interfaces Java puisque tu souhaiterais placer tes composants de manière absolue. Mais rassure toi c'est possible de faire ce que tu veux.

    Tu peux mettre le gestionnaire de placement du container de composants à null (setLayout(null)) puis positionner et dimensionner tes composants de façon fixe à l'aide de la méthode setBounds(int x, int y, int width, int height).

    Mais perso, je pense qu'utiliser les layouts c'est mieux.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    à l'aide de la méthode setBounds(int x, int y, int width, int height)
    En utilisant JBuilder pour placer des composants, il semblerait que setBounds soit utilisé.
    J'ai essayé avec NetBeans, et là le code utilisé pour le positionnement des objet m'a un peu dérouté. Je n'ai pas tout compris.

    Mais perso, je pense qu'utiliser les layouts c'est mieux
    Je suis bien d'accord avec ça. Mais n' y a-t-il vraiment pas de solution par rapport au souci que j'ai. J'ai bien compris ce que Descent m'a dit.

    Je me suis par contre dit que je pourrais associé un layout au JFrame, et ajouter à ce layout le conteneur que j'utilise.
    J'ai essayé mais ça ne marche pas terrible.
    Quelqu'un aurait-il une idée similaire ou autre, parce que même si c normal que ça fasse ainsi, c dommage parce que ça ne fait pas très beau.

    Merci.

    ++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 128
    Points : 151
    Points
    151
    Par défaut
    En principe, il n'a pas d'autre méthodes que l'utilisation de layouts ou alors le positionnement absolu. Dans ton cas précis, tu peux essayer d'allier les deux : dans ton code de départ, tu remplis ton JPanel 'pane' de la même manière que tu le fais maintenant, en précisant en plus une taille (fixe) pour ce panel (avec setSize par exemple). Ce que tu changes en revanche, c'est le ContentPane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    getContentPane().setLayout(null);
    //ajouter le panel avec les composants
    getContentPane().add(pane);
    //le placer dans le coin en haut à gauche
    pane.setLocation(0,0);

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par Marcin
    En principe, il n'a pas d'autre méthodes que l'utilisation de layouts ou alors le positionnement absolu.
    Je suis assez d'accord avec ça, mais avec NetBeans, voici un bout de code généré suite au placement d'objets.

    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
     
    org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                            .add(33, 33, 33)
                            .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 57, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(layout.createSequentialGroup()
                            .add(162, 162, 162)
                            .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 59, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .add(layout.createSequentialGroup()
                            .add(94, 94, 94)
                            .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 154, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap(152, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(27, 27, 27)
                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(213, Short.MAX_VALUE))
            );
            pack();
    Perso, je n'ai pas tout compris. Va falloir que je me documente.
    Sinon, je vais de ce pas, essayer ce que tu m'as proposé.
    ++

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Et d'après vous qu'est-ce qui est mieux, d'interdire tout simplement le re-dimensionnement de la JFrame, ou de fixer la taille et la position du conteneur ?

    Merci
    ++

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 128
    Points : 151
    Points
    151
    Par défaut
    Si tu tiens absolument à garder une même taille pour ton panel avec les composants, je pense qu'il vaut mieux interdire le redimensionnement du JFrame. Ceci pour la bonne raison que, dans le cas d'un panel à taille et emplacement fixes, un agrandissement n'apporte rien (je pars du principe que tu n'utilises l'espace "supplementaire"), en revanche un rappetissement de la fenêtre va "manger" une partie de ton panel (comme il est à taille fixe, tout ce qui ne rentre pas dans la fenêtre n'apparaît pas).
    Ceci étant dit, je pense, comme ça a déjà été dit plus haut, que tu devrais plutôt envisager une solution avec les layouts et laisser les composants se redimensionner comme ils veulent. Tu peux éventuellement bloquer le redimensionnement de certains avec des setMinimum/MaximumSize, mais tant que c'est pas gênant, laisse faire le swing.... C'est ce qui donne quand même les meilleurs résultats !

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Points : 122
    Points
    122
    Par défaut
    Merci pour vos conseils....
    Je vais partir sur cette solution là.
    Je pense aussi de toute manière qu'il est préférable de travailler avec les layout

    A+

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

Discussions similaires

  1. fixer la taille d'une interface matlab
    Par nanouchg dans le forum Images
    Réponses: 1
    Dernier message: 12/03/2011, 13h34
  2. Matrice de taille quelconque à partir d'une interface graphique
    Par LMU2S dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 28/02/2008, 12h31
  3. [C / Ada] Faire une interface graphique
    Par Casp dans le forum Ada
    Réponses: 6
    Dernier message: 15/04/2005, 15h06
  4. [RECHERCHE] un module pour developer une interface graphique
    Par romtrash dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/03/2005, 15h46
  5. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 27/10/2004, 23h10

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