Signaler

Positionner les widgets avec les layouts [Résolu]

Posez votre question josep-t - Dernière réponse le 10 juil. 2017 à 09:17 par josep-t
Bonjour,

Je suis en train de créer une fenêtre qui comprend 3 JTextField associés chacun à un bouton :
- 1ère ligne : 1textField, 1bouton
- 2ème ligne : 1textField, 1bouton
- 3ème ligne : 1textField, 1bouton

Puis tout en dessous, à droite de préférence, un bouton qui exécute tout mon programme.

Je ne suis pas très doué avec les layouts. Je pensais créer par exemple, un JPanel qui comprend mes 3 lignes de JTextField avec leur bouton et tout ca avec un GridLayout(3,2). Puis l'autre bouton dans un autre JPanel.
J'ai réussi à positionner mes JTextField avec les boutons, mais seulement je ne sais pas comment ajouter le dernier bouton en dessous à droite...De plus j'aimerai que mes widgets ne prennent pas tout l'espace de ma fenêtre, et que mes boutons à droite de mes JTextField soient plus petits (des petits carrés).

Quelqu'un pourrait-il m'aider sur la façon de procéder?
Afficher la suite 
Utile
+0
plus moins
Bonjour,

Le mieux est de combiner les layouts entre eux, tu peux par exemple les imbriquer les uns dans les autres.

Donc tu peux avoir un GridLayout(3,2) pour ton formulaire que tu placeras par exemple à WEST dans un BorderLayout et ton autre bouton à SOUTH, ce qui te laissera tout le CENTER disponible pour le reste de ta fenêtre.
KX 14600Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 19 juillet 2017 Dernière intervention - 5 juil. 2017 à 19:42
Par exemple le code qui correspond à mon explication de tout à l'heure :

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

public class Test {
    public static void main(String[] args) {
        JPanel menuWest = new JPanel(new GridLayout(3, 2));
        for (int i = 1; i <= 3; i++) {
            menuWest.add(new JTextField("text " + i));
            menuWest.add(new JButton("button " + i));
        }

        JPanel menuSouth = new JPanel(new FlowLayout());
        menuSouth.add(new JButton("Go"));

        JFrame frame = new JFrame();
        frame.add(menuWest, BorderLayout.WEST);
        frame.add(menuSouth, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

Ce qui donne :

Répondre
josep-t- 6 juil. 2017 à 10:42
Merci pour ton aide, seulement j'ai essayé et je n'arrive pas à obtenir ce que je veux. Je souhaite que mon bouton d'en bas soit situé à droite de la fenêtre, et mes JTextField accompagnés de mes 3 boutons au centre de la fenêtre. Et là, mon bouton d'en bas vient se placer au centre, ou juste à côté de mes autres boutons si j’élargis la taille de ma fenêtre, ici la partie de mon code concernée :


public class MalfunctionIHM extends JFrame {

JPanel pan1;
JPanel pan2;
JPanel panAll;
JTextField pdfFile;
JTextField textFile;
JTextField saveFile;
JButton buttonOpenPdfFile;
JButton buttonOpenTextFile;
JButton buttonSaveFile;
JButton buttonExecuteMalfunction;

public MalfunctionIHM() {
initialisation();
this.setVisible(true);
}

void initialisation() {
setTitle("Malfunction");
setSize(340, 180);
setLocationRelativeTo(null);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


pan1 = new JPanel(new GridLayout(3,2));
pdfFile = new JTextField();
pdfFile.setEditable(false);
pdfFile.setText("Chercher votre fichier pdf");
buttonOpenPdfFile = new JButton();
textFile = new JTextField();
textFile.setEditable(false);
textFile.setText("Chercher votre fichier txt");
buttonOpenTextFile = new JButton();
saveFile = new JTextField();
saveFile.setEditable(false);
saveFile.setText("Enregistrer sous");
buttonSaveFile = new JButton();

pan1.add(pdfFile);
pan1.add(buttonOpenPdfFile);
pan1.add(textFile);
pan1.add(buttonOpenTextFile);
pan1.add(saveFile);
pan1.add(buttonSaveFile);

pan2 = new JPanel(new BorderLayout());

buttonExecuteMalfunction = new JButton("Executer");
pan2.add(buttonExecuteMalfunction);
panAll = new JPanel();
panAll.add(pan1, BorderLayout.CENTER);
panAll.add(pan2, BorderLayout.EAST);
setContentPane(panAll);
}

}

Répondre
josep-t- 6 juil. 2017 à 11:04
Je crois que c'est parce que j'avais pas donné de layout à mon panAll, mais le problème c'est que mes JTextField(et les boutons) prennent toute la largeur de la fenêtre, les boutons sont trop proches les uns des autres, j'aimerai quelque chose de beaucoup plus espacé...

Code :

public class MalfunctionIHM extends JFrame {

JPanel pan1;
JPanel pan2;
JPanel panAll;
JTextField pdfFile;
JTextField textFile;
JTextField saveFile;
JButton buttonOpenPdfFile;
JButton buttonOpenTextFile;
JButton buttonSaveFile;
JButton buttonExecuteMalfunction;

public MalfunctionIHM() {
initialisation();
this.setVisible(true);
}

void initialisation() {
setTitle("Malfunction");
setSize(340, 180);
setLocationRelativeTo(null);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


pan1 = new JPanel(new GridLayout(3,2));
pdfFile = new JTextField();
pdfFile.setEditable(false);
pdfFile.setText("Chercher votre fichier pdf");
buttonOpenPdfFile = new JButton();
textFile = new JTextField();
textFile.setEditable(false);
textFile.setText("Chercher votre fichier txt");
buttonOpenTextFile = new JButton();
saveFile = new JTextField();
saveFile.setEditable(false);
saveFile.setText("Enregistrer sous");
buttonSaveFile = new JButton();

pan1.add(pdfFile);
pan1.add(buttonOpenPdfFile);
pan1.add(textFile);
pan1.add(buttonOpenTextFile);
pan1.add(saveFile);
pan1.add(buttonSaveFile);

pan2 = new JPanel(new BorderLayout());

buttonExecuteMalfunction = new JButton("Executer");
pan2.add(buttonExecuteMalfunction, BorderLayout.EAST);
panAll = new JPanel(new BorderLayout());
panAll.add(pan1, BorderLayout.CENTER);
panAll.add(pan2, BorderLayout.SOUTH);
setContentPane(panAll);
}

}
Répondre
KX 14600Messages postés samedi 31 mai 2008Date d'inscription ModérateurStatut 19 juillet 2017 Dernière intervention josep-t - 6 juil. 2017 à 11:15
Ça ne sert à rien d'avoir une méthode initialisation(), c'est déjà à ça que sert le constructeur de l'objet...

De plus un certain nombre de composants, notamment les JPanel, n'ont aucun intérêt à être des attributs de la classe, il suffirait qu'ils soient en variables locales.

Quant à ton panAll, c'est tout simplement ta JFrame...

Pour le reste un petit dessin ce serait bien pour comprendre ce que tu veux.
Sachant qu'il y a des Layout beaucoup plus complets qui permettent de faire quasiment tout ce que l'on veut, mais ils sont aussi plus difficile à prendre en main. Exemple avec GroupLayout : https://docs.oracle.com/javase/tutorial/uiswing/layout/group.html
Répondre
josep-t- 6 juil. 2017 à 12:06
Merci pour les conseils, je n'arrive pas à mettre d'image, surement car je ne suis pas membre (et je n'arrive pas à me connecter à mon compte, car je reçois par mail un code d'activation, et lorsque je clique sur le lien, on me renvoie vers la page d'inscription...).

Je vais essayé de l'expliquer avec mes mots : J'aimerai tout simplement espacer mes boutons les uns des autres, avoir de l'espace blanc entre le haut de ma fenêtre et le contenu, le bas et les côtés de la fenêtre et le contenu, et également avoir de l'espace dans le contenu :
- Un JTextField avec un bouton
- Saut de ligne
- Un JTextField avec un bouton
- Saut de ligne
- Un JTextField avec un bouton
- Saut de ligne

Et par ailleurs j'aimerai aussi que les boutons associés aux JTextField soient des petits carrés.

Je sais pas si c'est assez clair, mais en gros je veux pas que tous mes Widgets soient collés les uns les autres...
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Voici un code avec GroupLayout. Pour rappel la documentation est disponible ici : How to Use GroupLayout
 

Pour commencer, un exemple pour avoir un bouton carré :

public class SquareIconButton extends JButton {
    public SquareIconButton(Icon icon) {
        setIcon(icon);
    }

    private Dimension squareSize(Dimension dim) {
        int size = Math.min(dim.width, dim.height);
        return new Dimension(size, size);
    }

    @Override
    public Dimension getMinimumSize() {
        return squareSize(super.getMinimumSize());
    }

    @Override
    public Dimension getPreferredSize() {
        return squareSize(super.getPreferredSize());
    }

    @Override
    public Dimension getSize() {
        return squareSize(super.getSize());
    }

    @Override
    public Dimension getMaximumSize() {
        return squareSize(super.getMaximumSize());
    }
}

Et voici le code pour la fenêtre.

import javax.swing.*;

public class MalfunctionIHM extends JFrame {

    public MalfunctionIHM() {
        JLabel labelOpenPdfFile = new JLabel("Chercher votre fichier pdf");
        JButton buttonOpenPdfFile = new SquareIconButton(new ImageIcon("OpenPdfFile.png"));

        JLabel labelOpenTextFile = new JLabel("Chercher votre fichier txt");
        JButton buttonOpenTextFile = new SquareIconButton(new ImageIcon("OpenTextFile.png"));

        JLabel labelSaveFile = new JLabel("Enregistrer sous");
        JButton buttonSaveFile = new SquareIconButton(new ImageIcon("SaveFile.png"));

        JButton buttonExecute = new JButton("Executer");

        GroupLayout layout = new GroupLayout(getContentPane());
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        layout.setHorizontalGroup(
            layout.createSequentialGroup()
                .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                        .addComponent(labelOpenPdfFile)
                        .addComponent(labelOpenTextFile)
                        .addComponent(labelSaveFile)
                ).addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                        .addComponent(buttonOpenPdfFile)
                        .addComponent(buttonOpenTextFile)
                        .addComponent(buttonSaveFile)
                )
                .addGap(30)
                .addComponent(buttonExecute)
        );

        layout.setVerticalGroup(
            layout.createSequentialGroup()
                .addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                        .addComponent(labelOpenPdfFile)
                        .addComponent(buttonOpenPdfFile)
                ).addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                        .addComponent(labelOpenTextFile)
                        .addComponent(buttonOpenTextFile)
                ).addGroup(
                    layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                        .addComponent(labelSaveFile)
                        .addComponent(buttonSaveFile)
                )
                .addGap(10)
                .addComponent(buttonExecute)
        );

        setLayout(layout);

        setTitle("Malfunction");
        setSize(340, 180);
        setLocationRelativeTo(null);
        setResizable(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MalfunctionIHM();
    }
}
josep-t- 10 juil. 2017 à 09:17
Merci beaucoup pour ton aide ça marche super, sujet résolu :)
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !