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
?
Définissez GridBagLayout pour JPanel , mettez JLabel sans aucun GridBagConstraints sur JPanel , - JLabel sera centré
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();
}
});
}
}
Supposez que votre JLabel
s'appelle label
, puis utilisez:
label.setHorizontalAlignment(JLabel.CENTER);
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.
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());