2010-01-26 92 views
2

我正在使用GridBagLayout(當前)顯示兩行。我知道這個佈局對於這個任務來說是過分的,但我正在努力學習如何使用它。問題是,我已經添加了兩個小組到兩個獨立的行和周圍有內容的巨大差距(見圖片和代碼如下): alt text http://www.imagechicken.com/uploads/1264533379009864500.pngGridBagLayout填充

Image background; 
    public Table(){ 
     super(); 
     ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png")); 
     background = ii.getImage(); 
     setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT); 

     setLayout(new GridBagLayout()); 

     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.gridx = 0; 
     constraints.gridy = 0; 
     constraints.fill = GridBagConstraints.HORIZONTAL; 

     JButton button = new JButton("hello world"); 
     JPanel panel1 = new JPanel(); 
     panel1.setPreferredSize(new Dimension(800,100)); 
     panel1.add(button, BorderLayout.CENTER); 
     panel1.setBackground(Color.yellow); 
     add(panel1, constraints); 

     constraints.gridx = 0; 
     constraints.gridy = 1; 

     JPanel middlePanel = new JPanel(); 
     middlePanel.setPreferredSize(new Dimension(800,350)); 
     middlePanel.add(button, BorderLayout.CENTER); 
     middlePanel.setBackground(Color.blue); 
     add(middlePanel, constraints); 


    } 
+0

您已經接受了錯誤的答案 – willcodejavaforfood 2010-01-27 09:30:04

+0

@willcodejavaforfood我不同意:當有完成同一件事的兩個方面,你可以不爭,一個是錯誤的,當兩者的工作。請注意,我確實承認可以使用'GridBagConstraints'來完成此操作,這只是我更喜歡的選擇。 – bguiz 2010-01-27 13:15:05

回答

4

不幸的是,與GridBagLayout,如果內容不填滿它所在的整個容器,它會自動將其所有內容集中在其容器中。這就是爲什麼你會遇到非常大的差距。

基本上有兩種方法來解決這個問題:

  1. 難的方法:撥弄GridBagConstraints。在試圖避免集中行爲時,我對此有限的成功。
  2. 簡單的方法:將GridBagLayout放在FlowLayout的內部,然後將FlowLayout的對齊方式設置爲左上方或您希望的任何方式。

我上週某個時候問自己並回答了我的問題,this question

所以你的情況,你要添加的panel1middlePanel直接到JFrame(?),用GridBagLayout

JFrame (GridBagLayout) 
- panel1 
- middlePanel 

我建議這種替代結構,而不是,擺脫所有的額外空間(如果你喜歡,也可以居中對齊)。

JFrame (FlowLayout) 
- JPanel (GridBagLayout) 
    - panel1 
    - middlePanel 

HTH

+4

-1這個答案不正確。你需要做的是在GridBagConstraints上設置weightx和weighty屬性。兩者的默認值都是0。0,導致一切都'中心' – willcodejavaforfood 2010-01-27 09:29:15

+0

@willcodejavaforfood看到我對主要問題的評論 – bguiz 2010-01-27 13:15:44

7

使用

constraints.fill = GridBagConstraints.BOTH; 
constraints.weightx = 1d; 
constraints.weighty = 1d; 

JavaDoc對於weightx/weighty說:

指定如何分配額外的水平/垂直空間。

JavaDocfill:當組件的顯示區域大於組件的所需尺寸大

此字段用於。它決定是否要 調整組件的大小,如果是的話,如何。

+0

你也不能重複使用這樣的約束。您需要爲第二個面板創建一個新實例。 – 2010-01-26 21:40:29

+2

+1這是正確的答案...... – willcodejavaforfood 2010-01-27 09:29:48