2014-04-14 50 views
2

通常情況下,我對Swing和不同的佈局並沒有那麼壞,但是這個確實讓我感到困惑。GridBagLayout - 不同的行大小

以下使用GridBagLayout的圖表出現了什麼問題?每個厚的rectange都是一個JPanel。 細線只是幫助正確的y值。

提前致謝!

Mein Problem

package at; 

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GridMask extends JFrame { 

JPanel jPanel1, jPanel2, jPanel3, jPanel4, jPanel5, jPanel6; 

public GridMask() { 
    unimportantStuff(); 

    GridBagLayout gbl = new GridBagLayout(); 
    setLayout(gbl); 

    GridBagConstraints gbc; 

    gbc = getGbc(0, 0, 3, 1, 0.5); 
    gbl.setConstraints(jPanel1, gbc); 

    gbc = getGbc(1, 0, 4, 1, 0.75); 
    gbl.setConstraints(jPanel2, gbc); 

    gbc = getGbc(2, 0, 3, 1, 0.5); 
    gbl.setConstraints(jPanel3, gbc); 

    gbc = getGbc(0, 3, 3, 1, 0.5); 
    gbl.setConstraints(jPanel4, gbc); 

    gbc = getGbc(1, 4, 2, 1, 0.25); 
    gbl.setConstraints(jPanel5, gbc); 

    gbc = getGbc(2, 3, 3, 1, 0.5); 
    gbl.setConstraints(jPanel6, gbc); 

    add(jPanel1); 
    add(jPanel2); 
    add(jPanel3); 
    add(jPanel4); 
    add(jPanel5); 
    add(jPanel6); 

    setVisible(true); 
} 

private GridBagConstraints getGbc(int x, int y, int height, int width, double weightY) { 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.gridx = x; 
    gbc.gridy = y; 
    gbc.gridheight = height; 
    gbc.gridwidth = width; 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.weightx = 1.0; 
    gbc.weighty = weightY; 

    return gbc; 
} 

private void unimportantStuff() { 
    jPanel1 = new javax.swing.JPanel(); 
    jPanel2 = new javax.swing.JPanel(); 
    jPanel3 = new javax.swing.JPanel(); 
    jPanel4 = new javax.swing.JPanel(); 
    jPanel5 = new javax.swing.JPanel(); 
    jPanel6 = new javax.swing.JPanel(); 

    jPanel1.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    jPanel2.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    jPanel3.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    jPanel4.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    jPanel5.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    jPanel6.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
} 

public static void main(String[] args) { 
    new GridMask(); 
} 
} 

結果是一個JFrame,其中兩行具有不同的高度,但在一個行中的細胞具有所有相同的高度。

+1

我不明白你在問什麼。圖表對我來說看起來很好。發佈你的[SSCCE](http://www.sscce.org/)來證明問題。 – camickr

+0

@camickr:已添加; MarkW:對不起,只是一個錯字 – NeedCoffee

回答

1

但是連續的單元格具有完全相同的高度。

gbc.fill = GridBagConstraints.BOTH; 

你告訴佈局尺寸的所有組件,以填補在每個小區的可用空間。

+0

不應該與填充結合的重量告訴佈局,該列有兩行,一個使用3/4的面板尺寸,一個使用1/4?我錯了嗎?還是應該填充只能使用所有的地方,還是尊重重量? – NeedCoffee

+0

@NeedCoffee,「重量」約束用於指示調整行爲時會發生什麼。組件分配了他們的首選大小。那麼如果你有一個額外的40個像素的使用空間是基於「重量」百分比分配的。所以組件將獲得.75,.25或.50。如果使用「填充」,則所有組件都將調整到最大空間。閱讀關於[如何使用GridBagLayout]的Swing教程中的部分(http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html),以獲得關於約束如何工作的更詳細解釋。 – camickr