Positionner les widgets avec les layouts

Résolu/Fermé
josep-t - 5 juil. 2017 à 14:43
 josep-t - 10 juil. 2017 à 09:17
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?
A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 juil. 2017 à 18:08
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.
0
Merci de m'avoir répondu, tu parles de "combiner les layouts entre eux", pourrais-tu me donner un brief exemple de code?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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 :

0
josep-t > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
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);
}

}

0
josep-t > 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);
}

}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > 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
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
7 juil. 2017 à 22:21
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();
    }
}
0
Merci beaucoup pour ton aide ça marche super, sujet résolu :)
0