2012-01-26 56 views
2

我想佈局我JPane像這樣:如何使用GridBagConstraints創建佈局?

------- 
|  | 
|  | 
|  | 
------- 
|  | 
------- 

這樣,頂部比底部大/高(頂部由另一個JPanel的,並使用圖形對象來顯示圖像,而底部部分也由另一個JPanel組成,但使用Graphics對象繪製一些行和文本)。

我聽說最好的方法是使用GridBagLayout和GridBagConstraints。

我想弄清楚GridBagConstraints的適當屬性,我遇到了一些困難。這是我迄今爲止...

對於頂部,我有:

gridx = 0 
gridy = 0 
weighty = 1.0; // expand downwards, because the bottom should never expand in the Y direction 
fill = GridBagConstraints.BOTH 

對於底部,我有:

gridx = 0 
gridy = 1 
fill = GridBagConstraints.HORIZONTAL 
anchor = GridBagConstraints.PAGE_END 

不幸的是,所有的方式結束了發生的是一個巨大的灰色矩形出現(我有一個白色背景的應用程序) - 沒有圖像加載,沒有線/文本出現。

我該怎麼辦?我應該調整什麼?

我讀過一些教程,但它看起來真的很混亂,我在第一個應用程序中工作,但現在當我嘗試這樣做時,它似乎不適用於我。

+1

你能舉個[SSCCE(HTTP:/ /sscce.org/)顯示問題?從您列出的內容來看,甚至不清楚面板是否被添加到任何東西中...... –

+0

請發佈您用於設置窗格的整個代碼。 –

+0

-1,'我聽說最好的方法是使用GridBagLayout和GridBagConstraints.'這不是你在3小時前提出這個問題時得到的建議:http://stackoverflow.com/questions/ 9012976/java-awt-gui-container-to-hold-a-top-and-a-bottom-half – camickr

回答

4

通常,對於網格包佈局

  • 如果你想要的成分比例,必須給它的尺度方向上的重量,和任何尺寸(寬度/高度)您爲該方向上設定將被忽略佈局經理。

  • 如果您不想使用組件比例,那麼該組件必須定義其大小(如果需要,您可以在java的文檔中深入研究此主題)。就你的底部面板而言,你至少需要給它一個首選的高度。

這可以作爲你的期望工作

pnlTop.setBackground(Color.WHITE); 
pnlBottom.setBackground(Color.BLUE); 

// Because you don't want the bottom panel scale, you need to give it a height. 
// Because you want the bottom panel scale x, you can give it any width as the 
// layout manager will ignore it. 
pnlBottom.setPreferredSize(new Dimension(1, 20)); 


getContentPane().setLayout(new GridBagLayout()); 
GridBagConstraints cst = new GridBagConstraints(); 
cst.fill = GridBagConstraints.BOTH; 
cst.gridx = 0; 
cst.gridy = 0; 
cst.weightx = 1.0; // --> You miss this for the top panel 
cst.weighty = 1.0; 
getContentPane().add(pnlTop, cst); 

cst = new GridBagConstraints(); 
cst.fill = GridBagConstraints.HORIZONTAL; 
cst.gridx = 0; 
cst.gridy = 1; 
cst.weightx = 1.0; // You miss this for the bottom panel 
cst.weighty = 0.0; 
getContentPane().add(pnlBottom, cst); 

更進一步,如果你想使用網格包佈局,我建議您嘗試無痛,網格包庫http://code.google.com/p/painless-gridbag/(我是該圖書館的作者)。它不解決這個問題,你(因爲你的問題涉及在網格包佈局管理組件的大小),但它會爲你節省大量的輸入,使您的代碼更易於維護

pnlBottom.setPreferredSize(new Dimension(1, 20)); 

PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false); 
gbl.row().cell(pnlTop).fillXY(); 
gbl.row().cell(pnlBottom).fillX(); 
gbl.done(); 
+0

無痛Gridbag看起來真的很好...偉大的工作人... –

0

如果你可以用屆黨libs,你也可以考慮FormLayout。它允許您指定每行的高度和調整行爲。

我沒有測試這一點,但

FormLayout layout = new FormLayout( 
"pref", //columns 
"50dlu:grow(0.2)","25dlu:grow(0.1)" //rows 
); 

可能做的伎倆。關於語法的詳細信息可以在the JGoodies Forms pdf

2

不知道從你的問題被發現,也許會幫助你頂在70%左右,底部在30%

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

public class BorderPanels extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public BorderPanels() { 
     getContentPane().setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JPanel panel1 = new JPanel(); 
     Border eBorder = BorderFactory.createEtchedBorder(); 
     panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct")); 
     gbc.gridx = gbc.gridy = 0; 
     gbc.gridwidth = gbc.gridheight = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.anchor = GridBagConstraints.NORTHWEST; 
     gbc.weightx = gbc.weighty = 70; 
     getContentPane().add(panel1, gbc); 
     JPanel panel2 = new JPanel(); 
     panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct")); 
     gbc.gridy = 1; 
     gbc.weightx = 30; 
     gbc.weighty = 30; 
     gbc.insets = new Insets(2, 2, 2, 2); 
     getContentPane().add(panel2, gbc); 
     pack(); 
    } 

    public static void main(String[] args) { 
     new BorderPanels().setVisible(true); 
    } 
}