Java布局管理器垂直中心

时间:2009-05-22 13:46:20

标签: java swing layout

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

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

4 个答案:

答案 0 :(得分:23)

尝试使用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);
}

答案 1 :(得分:10)

首先,我应该提一下,阅读我关于布局的文章: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”更容易“看到”

答案 2 :(得分:0)

面板本身的GroupLayout,GroupLayout.Alignment.CENTER,垂直和水平,setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight))设置面板不调整大小。

您也可以在面板上执行setMinimumSize和setMaximum size,以确保安全。

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

答案 3 :(得分:0)

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

}