web-dev-qa-db-fra.com

Centrage d'un JLabel dans un JPanel

J'ai un panneau dérivé de JPanel. J'ai un contrôle personnalisé dérivé de JLabel. J'essaie de centrer ce JLabel personnalisé sur mon panneau.

La seule façon dont je sais que cela fonctionne est d'utiliser la mise en page nulle (setLayout(null)), puis de calculer le point setLocation() personnalisé de JLabel pour qu'il soit au bon endroit.

Le JLabel personnalisé est physiquement déplacé d'un panneau vers ce panneau dans cette application et je pense que l'emplacement précédemment défini dans setLocation affecte les choses. Cependant, lorsque je le mets à (0,0), le composant monte dans le coin supérieur gauche.

BorderLayout ne fonctionne pas car lorsqu'un seul composant est fourni et placé dans BorderLayout.CENTER, la section centrale se développe pour remplir tout l'espace.

Un exemple que j'ai coupé et collé à partir d'un autre site a utilisé BoxLayout et component.setAlignmentX(Component.CENTER_ALIGNMENT). Cela n'a pas fonctionné non plus.

Une autre réponse a mentionné la priorité sur la fonction getInset() du panneau (je pense que c'est ainsi qu'on l'appelait), mais cela s'est avéré être une impasse.

Jusqu'à présent, je travaille avec un panneau avec une disposition GridBagLayout et j'inclus un objet GridBagConstraints lorsque j'insère le JLabel personnalisé dans mon panneau. C'est cependant inefficace. Existe-t-il une meilleure façon de centrer le JLabel dans mon JPanel?

18
Shackleford

Définissez GridBagLayout pour JPanel , mettez JLabel sans aucun GridBagConstraints sur JPanel , - JLabel sera centré

enter image description here

exemple

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

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("CenteredJLabel");

    public CenteredJLabel() {
        panel.setLayout(new GridBagLayout());
        panel.add(label);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}
34
mKorbel

Supposez que votre JLabel s'appelle label, puis utilisez:

label.setHorizontalAlignment(JLabel.CENTER);
16
hiuller

Oubliez tous les LayoutManagers dans la bibliothèque Java Standard et utilisez MigLayout . D'après mon expérience, il est beaucoup plus facile de travailler avec un fait généralement exactement ce que vous attendez qu'il fasse.

Voici comment accomplir ce que vous recherchez après avoir utilisé MigLayout.

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Test
{
    public static void main( String[] args )
    {
        JFrame frame = new JFrame( );
        JPanel panel = new JPanel( );

        // use MigLayout
        panel.setLayout( new MigLayout( ) );

        // add the panel to the frame
        frame.add( panel );

        // create the label
        JLabel label = new JLabel( "Text" );

        // give the label MigLayout constraints
        panel.add( label, "Push, align center" );

        // show the frame
        frame.setSize( 400, 400 );
        frame.setVisible( true );
    }
}

La plupart de cela n'est que passe-partout. La clé est la contrainte de mise en page: "Push, align center":

align center indique à MigLayout de placer le JLabel au centre de sa cellule de grille.

Push indique à MigLayout d'agrandir la cellule de la grille pour remplir l'espace disponible.

8
ulmangt

BoxLayout est le chemin à parcourir. Si vous configurez un X_AXIS BoxLayout, essayez d'ajouter des colles horizontales avant et après le composant:

panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
8
Jakub Zaverka