Java布局管理器垂直中心

我有使用组布局来组织一些标签的面板。 我想在重新resize时保持屏幕的这个面板中心。 如果我使用流程布局将面板放在另一个面板中,我可以保持标签水平居中但不垂直居中。 哪个布局管理器允许我将面板保持在屏幕中间?

我也尝试了边框布局并将其放在中心,但它调整到窗口大小。

尝试使用GridBagLayout并添加带有空GridBagConstrants对象的面板。
例如:

 public static void main(String[] args) { JFrame frame = new JFrame(); frame.setLayout(new GridBagLayout()); JPanel panel = new JPanel(); panel.add(new JLabel("This is a label")); panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see frame.add(panel, new GridBagConstraints()); frame.setSize(400, 400); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } 

首先,我应该提一下,阅读我关于布局的文章: http ://web.archive.org/web/20120420154931/http: //java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/ 。 它很老但非常有用(不幸的是那篇文章在BoxLayout之前发布。当我在JavaOne上发表演讲时我有一些幻灯片,其中包括http://javadude.com/articles/javaone上的 BoxLayout)

试试BoxLayout:

 Box verticalBox = Box.createVerticalBox(); verticalBox.add(Box.createVerticalGlue()); verticalBox.add(stuffToCenterVertically); verticalBox.add(Box.createVerticalGlue()); 

如果你想集中那些东西,请使用Horizo​​ntalBox作为stuffToCenterVertically:

 Box horizontalBox = Box.createHorizontalBox(); horizontalBox.add(Box.createHorizontalGlue()); horizontalBox.add(stuffToCenter); horizontalBox.add(Box.createHorizontalGlue()); 

比Gridbag更容易在代码中“看到”

您可以构建自己的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; } } } } } 

面板本身的GroupLayout.Alignment.CENTERGroupLayout.Alignment.CENTER ,纵向和横向,以及setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight))用于将面板设置为不resize。

你也可以在面板上做setMinimumSize和setMaximum大小,只是为了安全起见。

如果你感觉时髦,你可以通过仔细选择平行/顺序组并适当地对标签进行分组来为整个事情使用一个GroupLayout。