2009-05-22 100 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; 
      } 
     } 
    } 
} 

}