2013-04-12 59 views
0

我在JPanel中有5個組件。 一切看起來順利,我已經添加了前4個組件。 但是,當我嘗試將第五個組件添加到JPanel時,組件之間的間距因任何原因而發生更改!Java GridBagConstraints

無第五部分:

First Name: [..............] 

Last Name: [..............] 

有了:

First Name:---------------- [.............] 

Last Name:----------------- [.............] 

What is your favorite sport: 

假裝上面的標籤和文本框之間的虛線是空間

標籤和文本框的變化之間的間距! 這是我的代碼,請幫助我!

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame("Survey"); 
    frame.setSize(800, 600); 
    frame.setLayout(new FlowLayout(FlowLayout.CENTER)); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel p1 = new JPanel(new GridBagLayout()); 
    //LINE.START = Top Left Corner 
    frame.add(p1); 

    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.insets = new Insets(5, 5, 10, 10); 

    JLabel lblFirstN = new JLabel("First Name:"); 
    JLabel lblLastN = new JLabel("Last Name:"); 
    JLabel lblFavSport = new JLabel("What is your favorite sport:"); 

    JTextField txtFirstN = new JTextField(); 
    txtFirstN.setPreferredSize(new Dimension(100, 20)); 

    JTextField txtLastN = new JTextField(); 
    txtLastN.setPreferredSize(new Dimension(100, 20)); 

    gbc.gridx = 0; 
    gbc.gridy = 0; 
    p1.add(lblFirstN, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 0; 
    p1.add(txtFirstN, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 1; 
    p1.add(lblLastN, gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 1; 
    p1.add(txtLastN, gbc); 

    //this block of code is what is screwing me 
    gbc.gridx = 0; 
    gbc.gridy = 2; 
    p1.add(lblFavSport, gbc); 
} 
+0

請問,有人可以迴應。 –

+0

問題是什麼?你是否試圖將底部標籤與其他標籤對齊? – Reimeus

+0

我剛發現,如果我減少JLabel的文本數量,間距問題就會消失。所以是的,我試圖將底部標籤與其他標籤對齊,但如果文本太長,導致間距問題,並且在這種情況下,「您最喜歡的運動是什麼」太長了.........這沒有意義。 –

回答

1

的原因,最後JLabel不與以前的2對準的是,所有的標籤都是中心對齊,並出現在同一列中。當只有2個標籤時,由於它們的寬度相等,所以它們看起來是一致的。添加第三個,標籤出現交錯。

要修正,可以錨定標籤通過錨定組件GridBagConstraints.WEST對付這個效果,並設置沿重量x軸:

gbc.weightx = 1; 
gbc.anchor = GridBagConstraints.WEST; 

這具有左取向組分的其GridBagLayout「內的效果細胞」。

3

你得到這個輸出的原因是因爲這是佈局管理器的設計方式。

GridBagLayoutGridLayout的(虛擬)擴展。事實上,它將組件排除在網格之外,但要比GridLayout靈活得多。這是關閉你會得到像包含的佈局管理器中的HTML表格。

讓我們仔細看看。下面的代碼...

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.anchor = GridBagConstraints.WEST; 
add(new JLabel("First Name"), gbc); 
gbc.gridy++; 
add(new JLabel("Last Name"), gbc); 

gbc.gridx = 1; 
gbc.gridy = 0; 
add(new JTextField(15), gbc); 
gbc.gridy++; 
add(new JTextField(15), gbc); 

生成

enter image description here

很明顯,你可以看到行和列。每一行都有相同的高度和每一列具有相同的寬度......

現在,如果我們添加一個標籤,並現場...

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.anchor = GridBagConstraints.WEST; 
add(new JLabel("First Name"), gbc); 
gbc.gridy++; 
add(new JLabel("Last Name"), gbc); 
gbc.gridy++; 
add(new JLabel("What is your favorite sport:"), gbc); 

gbc.gridx = 1; 
gbc.gridy = 0; 
add(new JTextField(15), gbc); 
gbc.gridy++; 
add(new JTextField(15), gbc); 
gbc.gridy++; 
add(new JTextField(15), gbc); 

,這是你目前的問題...

enter image description here

你可以看到,第一列的寬度有所增加,以適應新的標籤...

現在我們可以通過使用解決這個問題...

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.anchor = GridBagConstraints.WEST; 
add(new JLabel("First Name"), gbc); 
gbc.gridy++; 
add(new JLabel("Last Name"), gbc); 
gbc.gridy++; 
gbc.gridwidth = 2; 
add(new JLabel("What is your favorite sport:"), gbc); 

gbc.gridwidth = 1; 
gbc.gridx = 1; 
gbc.gridy = 0; 
add(new JTextField(15), gbc); 
gbc.gridy++; 
add(new JTextField(15), gbc); 
gbc.gridx = 2; 
gbc.gridy++; 
add(new JTextField(15), gbc); 

注:最後一個領域gridx位置不得不增加,其他明智它實際上坐到那邊的標籤!現在

enter image description here

,那最好不過了,但是,我不認爲這是相當你想要的:P

我們需要調整前兩個領域跨越到下一個單元格爲好。 ..

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridx = 0; 
gbc.gridy = 0; 
gbc.anchor = GridBagConstraints.WEST; 
add(new JLabel("First Name"), gbc); 
gbc.gridy++; 
add(new JLabel("Last Name"), gbc); 
gbc.gridy++; 
gbc.gridwidth = 2; 
add(new JLabel("What is your favorite sport:"), gbc); 

gbc.gridwidth = 2; 
gbc.gridx = 1; 
gbc.gridy = 0; 
add(new JTextField(15), gbc); 
gbc.gridy++; 
add(new JTextField(15), gbc); 
gbc.gridx = 2; 
gbc.gridy++; 
add(new JTextField(15), gbc); 

enter image description here

最後:P - 簡單的餡餅:d

你可能想仔細看看How to use GridBagLayout瞭解更多詳情...