web-dev-qa-db-fra.com

Comment faire en sorte que les composants Java Swing remplissent l'espace disponible?

Je n'arrive pas à faire en sorte que mes composants Java Swing fonctionnent correctement ensemble.

Ce que je veux faire, c'est qu'un JPanel remplisse TOUT l'espace disponible dans un JTabbedPane. Pour le moment, ma configuration est la suivante:

public class Gui extends JFrame {
    private final EventBus eventBus = EventBus.getInstance();
    private final ToolkitUtil toolkitUtil;
    private final Menu menu;
    private final InfoBar infoBar;
    private final JTabbedPane pane;

    ...

    private void buildLayout() {
        GridBagConstraints gbc = new GridBagConstraints();

        setJMenuBar(menu);

        add(pane, BorderLayout.CENTER);
        add(infoBar, BorderLayout.SOUTH);

        pane.addTab("Plugins", new PluginPanel());
    }
}

public class PluginPanel extends JPanel {
    private final JPanel modelPanel;
    private final JPanel editorPanel;

    public PluginPanel() {
        setLayout(new GridBagLayout());

        modelPanel = new JPanel(new GridBagLayout());
        editorPanel = new JPanel(new GridBagLayout());

        buildLayout();
    }

    private void buildLayout() {
        GridBagConstraints gbc = new GridBagConstraints();

        modelPanel.setBorder(BorderFactory.createTitledBorder("Models"));
        editorPanel.setBorder(BorderFactory.createTitledBorder("Editors"));

        gbc.gridx = 0;
        gbc.fill = GridBagConstraints.BOTH;

        modelPanel.add(new JLabel("test label"), gbc);
        add(modelPanel, gbc);

        gbc.gridx = 1;
        add(editorPanel, gbc);
    }
}

Cela crée une fenêtre qui correspond à la taille souhaitée (dynamiquement proportionnelle à la taille de l'écran, non incluse dans le code ci-dessus). Le panneau d'onglets qui est placé au centre est développé pour occuper tout l'espace requis, ce qui est exactement ce que je veux. Mais les panneaux que j’ajoute à l’intérieur du panneau d’onglets n’ont que la taille de leur contenu. Si j'ajoute des étiquettes ou quoi que ce soit, cela ne fera que grossir les composants. Je veux qu'ils soient toujours développés pour remplir le panneau d'onglets.

31
Nico Huysamen

Essayez de définir les poids des contraintes GridBagConstraints sur des valeurs non nulles:

gbc.weightx = gbc.weighty = 1.0;
34
perp

Le moyen le plus simple consiste à utiliser une variable BorderLayout et à placer le composant en position CENTER.

54

Définissez MinimumSize de votre conteneur sur la taille souhaitée de votre choix, puis définissez ContentPane du conteneur avec votre panneau.

    setMinimumSize(new Dimension(width,height));
    setContentPane(new MyPanel());

Ce code fonctionne pour toutes les mises en page.

Ou appelez simplement votre conteneur:

    setContentPane(new MyPanel());

Ce code fonctionne pour BorderLayout ou Free Design

0
iriha kutukova