2009-05-22 97 views
9

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

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

回答

20

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

我一直想知道如何做到这一点,最终我放弃了,使用MigLayout代替。 – gencoreoperative 2011-11-02 15:08:52

+4

这就是我认为的gridbag:http://madbean.com/anim/totallygridbag/ :) – qben 2013-03-04 08:58:32

+0

当容器小于孩子的首选大小(但大于最小大小)时,GridBagLayout将失败。 – 2017-02-13 16:56:13

9

首先,我要指出,阅读我的文章布局:http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/。这是旧的,但非常有用(不幸的是那篇文章的预日期的BoxLayout我有一些幻灯片时我给了那个说话的JavaOne大会上,其中包括的BoxLayout在http://javadude.com/articles/javaone

尝试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()); 

方式来“看”的代码要比网格包

0

面板上的GroupLayout本身为GroupLayout.Alignment.CENTER,纵向和横向,setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight))设置面板不调整大小。

您也可以在面板上设置setMinimumSize和setMaximum大小,以确保安全。

如果您感觉时髦,可以通过仔细选择并行/连续组并适当分组标签来为整个事情使用单个GroupLayout。

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; 
      } 
     } 
    } 
} 

}