2014-04-13 146 views
1

我有一個面板用作卡布局的一部分。該面板使用GridBagLayout。我添加了兩個組件:JTextArea填充設置爲BOTH和JTextField填充設置爲水平。他們只佔據橫向空間。GridBagLayout不會填滿所有空間

 // Chat card setup 
     JPanel chatCard = new JPanel(new GridBagLayout()); 
     gc = new GridBagConstraints(); 

     gc.gridx = 0; 
     gc.gridy = 0; 
     gc.fill = GridBagConstraints.BOTH; 
     gc.weightx = 2; 
     chatArea = new JTextArea(); 
     chatCard.add(chatArea,gc); 

     gc.gridx = 0; 
     gc.gridy = 1; 
     gc.fill = GridBagConstraints.HORIZONTAL; 
     gc.anchor = GridBagConstraints.PAGE_END; 
     gc.weightx = 2; 
     JTextField msgField = new JTextField(); 
     msgField.setActionCommand("SendText"); 
     msgField.addActionListener(listener); 
     chatCard.add(msgField, gc); 

目前,它看起來像這樣

Panel with GridBagLayout

+0

您的預期產出是多少?請分享。 – Braj

+0

嗯,我認爲JTextArea會佔用所有的空間,TextField只會在底部 – Bebras

回答

7

嘗試用gc.weighty

 ... 
    gc.weightx = 2; 
    gc.weighty=1; 
    chatArea = new JTextArea(); 

    ... 
    JScrollPane scrollPane=new JScrollPane(chatArea); 
    chatCard.add(scrollPane,gc); 
    ... 

    ... 
    gc.weightx = 2; 
    gc.weighty=0; 
    JTextField msgField = new JTextField(); 
    ... 

添加JTextAreaJScrollPane否則你會得到意想不到的結果,當行是比它大高度。

使用gc.insets=new Insets(5, 5, 5, 5);如果你想要一些空間從上/左/下/右。

快照:

enter image description here

+0

的小欄(它的大小可以)。有趣的是,你的代碼並不完全符合我的需求。還有一些未使用的區域。 我將JTextArea權重設置爲1,將JTextFields設置爲0.現在看起來沒問題。 – Bebras

+0

是的,你可以改變它。我只是給你一個提示。對於一個聰明的人來說,暗示就足夠了。 :) – Braj

+0

我已經在我的文章中更新了它。 – Braj

3

@Braj具有GridBagLayout的答案 - 用沉重的約束,並1+他的答案,但我認爲你的設立是,如果你要好得多使用BorderLayout,將JTextArea放置在JScrollPane中,放置JScrollPane BorderLayout.CENTER和JTextField BorderLayout.SOUTH(也稱爲BorderLayout.PAGE_END)。

JPanel chatCard = new JPanel(new BorderLayout(5, 5)); 
    int rows = 20; 
    int cols = 40; 
    JTextArea chatArea = new JTextArea(rows, cols); 
    chatCard.add(new JScrollPane(chatArea), BorderLayout.CENTER); 

    JTextField msgField = new JTextField(cols); 
    msgField.setActionCommand("SendText"); 
    // msgField.addActionListener(listener); 
    chatCard.add(msgField, BorderLayout.PAGE_END); 
+0

你可能確實是對的......我今天很忙於使用GridBagLayout,我忘記了更基本的一個 – Bebras

+0

@Bebras:但是,braj再次正確回答你的實際問題。 1+給他的回答。 –