web-dev-qa-db-fra.com

Comment faire étendre un JPanel à la largeur maximale dans un autre JPanel

Je sens que j'ai besoin de reformuler un peu la question.

Question mise à jour ci-dessous.

J'ai un JPanel qui contient:

myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

Il contient les trois panneaux suivants:

JPanel avec taille fixe 'x' et 'y'

JPanel sans taille fixe

JPanel sans taille fixe et petite hauteur

Le second JPanel contient un JTable donc il se dilate pour remplir toute la hauteur et pousse le panneau inférieur tout en bas, comme prévu.

Comme ceci:

t
t
m
m
m
m
m
b

t = panneau supérieur, m = panneau central, b = panneau inférieur.

Ça marche. Mais le panneau inférieur n'a pas envie de remplir toute la largeur du parent, ce qui pose problème.

ttt
mmm
 b 

Je voudrais soit ceci, où le panneau remplit toute la largeur:

ttt
mmm
bbb

ou ceci, où le panneau inférieur est centré à gauche:

ttt
mmm
b

Ancienne question ci-dessous:

J'ai un JPanel qui contient:

.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

En son sein, il y a trois autres JPanels. Les deux premiers sont de taille fixe et celui du milieu ne l'est pas.

Je veux que mon panneau inférieur prenne uniquement la hauteur dont il a besoin, mais utilise toute la largeur disponible du JPanel extérieur.

J'ai essayé d'utiliser de la colle mais en vain, et je préférerais ne pas définir les tailles préférées et min/max. Existe-t-il un moyen de dire au composant de "Remplir toute la largeur des parents" en utilisant uniquement le gestionnaire de disposition et le cadre. Je préfère ne pas commencer à faire des hacks comme définir des tailles et des méthodes de remplacement.

Note: Je ne peux pas mettre de colle ou de remplissage dans le panneau intérieur, seuls le panneau extérieur et son gestionnaire de disposition peuvent être modifiés.

Tentative 1:

L'utilisation de myPanel.setLayout(new GridLayout(3, 1)); n'a pas produit les résultats escomptés. Il a fait une grille comme celle-ci:

XX
 X

Mais je m'attendais à:

X
X
X

Tentative 2:

L'utilisation de myPanel.setLayout(new GridLayout(0,1)); n'a pas produit les résultats escomptés. Il a fait une grille comme celle-ci:

x
x
x

Mais tous les panneaux étaient de la même taille, ignorant les contraintes.

13
Martin Nielsen

Si vous utilisez un BorderLayout et que le panneau b se trouve dans le SOUTH ou PAGE_END il remplit toute la largeur.

7
Andrew Thompson

Le moyen le plus simple serait d'utiliser un autre gestionnaire de mise en page tel que GridLayout qui dimensionne automatiquement les composants pour remplir le conteneur parent.

myPanel.setLayout(new GridLayout(0, 1));
16
Reimeus

Vous pouvez utiliser GridBagLayout , pour cela, en utilisant

gridBagObject.fill = GridBagConstraints.HORIZONTAL

Un exemple pour votre aide, concernant GridBagLayout.

Comme demandé dans les commentaires, lié à cela

Le BoxLayout est une autre alternative, qui respecte les tailles préférées des composants. Vous pouvez essayer cela si GridBagLayout est aussi difficile :-)

Code avec GridBagLayout, pour plus de clarté:

import javax.swing.*;
import Java.awt.*;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 1/10/13
 * Time: 7:43 PM
 */
public class GridBagExample
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        CustomPanel topPanel = new CustomPanel(Color.BLUE.darker().darker());
        CustomPanel middlePanel = new CustomPanel(Color.CYAN.darker().darker());
        CustomPanel bottomPanel = new CustomPanel(Color.DARK_GRAY);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 0.3;

        contentPane.add(topPanel, gbc);

        gbc.gridy = 1;
        contentPane.add(middlePanel, gbc);

        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        contentPane.add(bottomPanel, gbc);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new GridBagExample().displayGUI();
            }
        });
    }
}

class CustomPanel extends JPanel
{
    public CustomPanel(Color backGroundColour)
    {
        setOpaque(true);
        setBackground(backGroundColour);
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(200, 150));
    }
}

PRODUCTION :

GridBagExampleOutput

3
nIcE cOw