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.
Si vous utilisez un BorderLayout
et que le panneau b
se trouve dans le SOUTH
ou PAGE_END
il remplit toute la largeur.
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));
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 :