2011-08-24 154 views
13

我正在使用NetBeans GUI生成器來處理我的佈局(我對LayoutManager非常糟糕),並試圖放置一個簡單的JLabel,以便它始終在其父級JPanel中居中(水平) 。理想情況下,即使JPanel被調整大小,這也會保持真實,但如果這是一個瘋狂的編碼量,而不是僅僅在JPanel第一次創建時居中就足夠了。在JPanel上居中定位JLabel

我自己試圖處理佈局已經夠糟糕了,但是由於NetBeans GUI Builder自動生成不可變的代碼,因此我無法弄清楚如何執行此對中操作,並且我一直無法在網上找到任何內容幫我。

感謝任何能引導我走向正確方向的人!

回答

11

通過使用Borderlayout,您可以將任何JComponents添加到CENTER區域。有關示例,請參見an answer to Stack Overflow question Get rid of the gap between JPanels。這應該工作。

+0

感謝您的回覆,但是NetBeans GUI Build使用GroupLayout,並且這是不可覆蓋的。請記住,我不只是在試圖與Swing及其威脅性的LayoutManagers進行抗爭,我正在與專門爲GroupLayout自動生成代碼的GUI生成器戰鬥! – IAmYourFaja

+0

+1:BorderLayout是正確的。 – Heisenbug

+0

@Mara:我真的建議你開始學習如何使用佈局管理器。這並不困難。相反,使用gui builder很難獲得相同的結果。 – Heisenbug

10

即使BoxLayout的,你可以做到這一點:

JPanel listPane = new JPanel(); 
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS)); 

JLabel label = new JLabel(); 
listPane.add(Box.createHorizontalGlue()); 
listPane.add(label); 
listPane.add(Box.createHorizontalGlue()); 

mKorbel的解決方案非常適合你的目標。無論如何,我總是喜歡推薦BoxLayout,因爲它非常靈活。

+0

謝謝Overbose,但我堅持GroupLayout。如果我花更多的時間在客戶端,我一定會接受你的建議並從頭開始學習LayoutManagers。我只是在尋找一個快速和骯髒的解決方案。這使用GroupLayout。 – IAmYourFaja

+2

*「我被GroupLayout卡住了」*僅僅因爲你不知道如何使用Netbeans。我沒有使用它,但我看到了使用所有標準佈局的Netbeans用戶(即使使用GUI設計器)的代碼。 –

26

這裏有四種方式來中心中的部件:

4 Centered Components

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

class CenterComponent { 

    public static JLabel getLabel(String text) { 
     return getLabel(text, SwingConstants.LEFT); 
    } 

    public static JLabel getLabel(String text, int alignment) { 
     JLabel l = new JLabel(text, alignment); 
     l.setBorder(new LineBorder(Color.RED, 2)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel p = new JPanel(new GridLayout(2,2,4,4)); 
       p.setBackground(Color.black); 
       p.setBorder(new EmptyBorder(4,4,4,4)); 

       JPanel border = new JPanel(new BorderLayout()); 
       border.add(getLabel(
        "Border", SwingConstants.CENTER), BorderLayout.CENTER); 
       p.add(border); 

       JPanel gridbag = new JPanel(new GridBagLayout()); 
       gridbag.add(getLabel("GridBag")); 
       p.add(gridbag); 

       JPanel grid = new JPanel(new GridLayout()); 
       grid.add(getLabel("Grid", SwingConstants.CENTER)); 
       p.add(grid); 

       // from @0verbose 
       JPanel box = new JPanel(); 
       box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS)); 

       box.add(Box.createHorizontalGlue()); 
       box.add(getLabel("Box")); 
       box.add(Box.createHorizontalGlue()); 
       p.add(box); 

       JFrame f = new JFrame("Streeeetch me.."); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setContentPane(p); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+2

更新後+1 – mKorbel

6

瑪拉: 「您的答覆,謝謝,但在NetBeans GUI構建使用的GroupLayout,這是不可重寫。」

不正確!右鍵單擊NetBeans GUI構建器中的JFrame(或任何其他GUI容器)內的任意位置,然後選擇「設置佈局」。默認情況下,選擇「免費設計」,這是組織布局,但您可以選擇任何其他佈局,包括mKo​​rbel建議的邊框佈局。