I have a panel derived from JPanel
. I have a custom control derived from JLabel
. I am attempting to center this custom JLabel
on my panel.
The only way I know to do this that will work is to use the a null layout (setLayout(null)
) and then calculate the custom JLabel's setLocation()
point so that it's in the right spot.
The custom JLabel
is physically moved from one panel to this panel in this app and I believe the location previously set in setLocation
is affecting things. However when I set it to (0,0) the component goes up into the upper left corner.
BorderLayout
doesn't work because when only 1 component is provided and placed into BorderLayout.CENTER
, the central section expands to fill all of the space.
An example I cut and pasted from another site used BoxLayout
and component.setAlignmentX(Component.CENTER_ALIGNMENT)
. This didn't work either.
Another answer mentioned overriding the panel's getInset()
function (I think that's what it was called), but that proved to be a dead end.
So far I'm working with a panel with a GridBagLayout
layout and I include a GridBagConstraints
object when I insert the custom JLabel
into my panel. This is inefficient, though. Is there a better way to center the JLabel
in my JPanel
?
Set GridBagLayout for JPanel, put JLabel without any GridBagConstraints to the JPanel, JLabel will be centered
example
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();
}
});
}
}