2013-08-05 52 views
3

我使用从数据库中读取的动态内容填充GridBagLayout JPanel。我的问题是如果我能找到一种方法来设置最后一列权重为1.0。 Usualy当我创建静态GridBagLayout的面板,我可以做这样的事情:GridBagLayout行权重

GridBagLayout gbl_accPanel = new GridBagLayout(); 
    gbl_accPanel.columnWeights = new double[]{1.0}; 
    gbl_accPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0}; 
    accPanel.setLayout(gbl_accPanel); 

但现在,在我的情况,我不知道我有多少行都会有,所以我需要一种方法来推动所有的内容在顶部,这意味着使最后一行的权重为1.0来填充我的容器的其余部分。

很明显,我可以保留一个计数我添加的元素,比设置rowWeights,比revalidate();重绘();但我不喜欢这种方式。那么有没有更好的方法?

这里是一个图片,如果我的问题不清楚: enter image description here

什么,我现在做的:

public void setAccountRowWeights(int n) 
{ 
    weights = new double[n]; 
    for(int i=0; i<n-1; ++i) 
     weights[i] = 0.0; 
    weights[n-1] = 1.0; 
    gbl_accPanel.rowWeights = weights; 
} 
+0

我可以将weighty = 1.0添加到最后一个组件,但它仍然很好,但我必须自己确定最后一个组件。我在考虑是否可以设置gridbaglayout,以便我的最后一个组件将始终自动填充容器的其余部分。 – Chris

+0

对我而言,问题仍不清楚。您是否希望所有组件对于给定记录在“X轴”上占据相同的空间?如果是的话,那么你可以简单地将组件的数量分成'1.0 /(double)noOfComponents',以获得每个组件的'weightx'值。如果没有,那么你可以尝试'GridBagConstraints.REMAINDER'作为最后一个组件。虽然如果您可以提供所需的小图,那可能对了解情况有更多的帮助:-) –

回答

2

如果您不需要GridBagLayout其他任何特殊功能,你可以改为使用BorderLayout,其中“北”部分是具有未指定行数的嵌入式GridLayout(即“行数”参数为0)。

public class LayoutTest implements Runnable { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new LayoutTest()); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new BorderLayout()); 

     JPanel north = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < 5; ++i) { 
      JPanel p = new JPanel(); 
      p.setPreferredSize(new Dimension(0, 25)); 
      p.setBorder(new LineBorder(Color.BLACK, 1)); 
      p.setBackground(Color.WHITE); 
      north.add(p); 
     } 
     f.add(north, BorderLayout.NORTH); 

     JPanel center = new JPanel(); 
     center.setBackground(Color.RED); 
     f.add(center, BorderLayout.CENTER); 

     f.setSize(400, 400); 
     f.setVisible(true); 
    } 
} 
+0

谢谢准备。如果我可以用BorderLayout完成所有的工作,我可能会采用这种方法。 :) – Chris