Вы можете создать свой собственный LayoutManager для центрирования одного компонента (обе оси или только один). Вот тот, который делает это на обеих осях, вы можете легко изменить его, чтобы иметь вертикальное или горизонтальное центрирование.
Текущая реализация макетов первого видимого потомка, вы тоже можете это изменить ...
public class CentreLayout implements LayoutManager, java.io.Serializable {
public void addLayoutComponent(String name, Component comp) {
}
public void removeLayoutComponent(Component comp) {
}
public Dimension preferredLayoutSize(Container target) {
return target.getPreferredSize();
}
public Dimension minimumLayoutSize(Container target) {
return target.getMinimumSize();
}
public void layoutContainer(Container target) {
synchronized (target.getTreeLock()) {
Insets insets = target.getInsets();
Dimension size = target.getSize();
int w = size.width - (insets.left + insets.right);
int h = size.height - (insets.top + insets.bottom);
int count = target.getComponentCount();
for (int i = 0; i < count; i++) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
m.setBounds((w - d.width) / 2, (h - d.height) / 2, d.width, d.height);
break;
}
}
}
}
}