2011-06-15 40 views
11

我是Java Swing的新手,我一直在努力從左上角開始GridBagLayout,因此c.gridx = 0 c.gridy = 0會將我的對象放在左上角。在Java Swing中從左上角開始GridBagLayout

我會很感激,如果你能幫助我,告訴我需要什麼這點後做:

JPanel panel = new JPanel(new GridBagLayout()); 
    frame.add(panel); 
    GridBagConstraints c = new GridBagConstraints(); 

我知道,我必須使用或西北常量FIRST_LINE_START,但我不知道如何。我試圖這樣做',但它沒有意識到常量。

frame.getContentPane().add(panel, BorderLayout.NORTHWEST); 

感謝您的幫助。

回答

10

您需要使用您的GridBagConstraints'anchor屬性。這應該爲你做:

frame.setLayout(new GridBagLayout()); 
GridBagConstraints gbc = new GridBagConstraints(); 
gbc.anchor = GridBagConstraints.NORTHWEST; 
frame.add(panel, gbc); 

我不保證你不必設置約束對象的其他屬性來獲得你想要的佈局。尤其是,您可能需要將widthxwidthy設置爲1,以便面板佔用提供給它的所有可用空間。

+0

@Emir:你能做到這一點,但我覺得它通常是很好的保持面板而不是保留它的框架單獨的類。如果你這樣做,你甚至不需要擴展JFrame,你只需要將面板添加到直接的JFrame。如果你確實使用'frame。add()''''frame.setLayout()'等等,這些都是將調用委託給一個稱爲「內容窗格」的特殊面板。 – 2011-06-15 21:19:59

+0

謝謝,我所需要做的就是體重超重的魔術! – Emir 2011-06-16 06:13:26

+0

@MarkPeters這可以在沒有框架的情況下完成嗎?我將我的GridBagLayout嵌入DeckLayout中,並且Frame對我來說真的不起作用。任何你能提供的幫助都會很棒。我有點累了,或者玩弄了Layouts(我有與原始海報相同的問題)。 – theJollySin 2012-07-15 00:49:18

15

閱讀Swing教程How to Use GridBagLayout中的部分。關於「weightx,weighty」的部分指出:

除非您爲weightx或weighty指定了至少一個非零值,否則所有組件都會聚集在其容器的中心。

+0

感謝您的澄清;馬克的帖子幫助我理解了這一點。 – Emir 2011-06-16 06:14:24

+0

這正是我所需要的 - 謝謝。我不想玩框架內的面板佈局。這只是在GridBagConstraints設置中添加了一些額外的行。優秀。 – tsm 2011-07-05 21:10:10

5

對於那些使用IDE的人(例如NetBeans),我終於找到了一個不錯的訣竅:如果您想添加頂級組件並使用他們的首選大小:添加另一個空的面板,weighty = 1.0。從自動生成的代碼複製版本(NetBeans):

gridBagConstraints = new java.awt.GridBagConstraints(); 
gridBagConstraints.gridx = 0; 
gridBagConstraints.gridy = 2; 
gridBagConstraints.weighty = 1.0; 
jPanelOptions.add(jPanelFiller, gridBagConstraints); 
0

,如果你想在網格一路去頂,只需將您所有的份量= 0,直到最後一個項目,將其設置爲任意數量大於0,它將有效地將剩下的按鈕推到頂部。

不要忘了也增加你的按鈕的網格值。

否則它將被居中。 (同樣可以使用的gridx和的weightx值,如果你的arent使用c.fill = GridBagConstraints.HORIZONTAL屬性來完成。)

3

一個快速和簡單的方法:

添加一個空白的JLabel結束頁:

// your code goes here 
    gbc.weightx = 1; 
    gbc.weighty = 1; 

    bg.add(new JLabel(" "), gbc); // blank JLabel 
+0

完美工作。注意:在添加空白JLabel之前,僅在代碼的末尾使用gbc.weightx = 1和gbc.weighty = 1是重要的。所以它不適用於所有的組件,但僅適用於空白的JLabel。 – viniciussss 2016-04-28 15:58:47

0

有一種解決方法。您可以使用BorderLayout.NORTH將GridBagLayout面板放入BorderLayout面板中。然後,GridBagLayout面板中的Component將從頂部位置開始。

static void test4(){ 
    JFrame frame = new JFrame("Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(480, 360); 

    JPanel borderLayoutPanel=new JPanel(new BorderLayout()); 
    JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout()); 
    borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH); 
    frame.add(borderLayoutPanel); 

    JButton testButton=new JButton("test button"); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx=0; 
    c.gridy=0; 
    gridBagLayoutPanel.add(testButton, c); 

    frame.setVisible(true); 
} 

enter image description here