2014-07-13 420 views
6

我有一个JFrame,其根JPanel实例化为GridBagLayout。在运行时,面板将使用基于某些说明的组件进行填充,并且宽度,高度和x,y坐标将在说明中给出,以便与GridBagConstraints中的gridwidthgridheightgridxgridy字段一起使用。这些组件本身也可以是JPanel和它们自己的子组件,并且GridBagConstraints,GUI在树中描述,所以Frame被递归地填充。gridbaglayout的组件可以在调整大小时填充父框架吗?

我遇到的问题是,当框架被调整大小时,内部组件不会被拉伸以填充它们给定的宽度和高度。我已经给出了一个下面的布局代码的例子,里面有截图。

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

public class GridBagTest extends JPanel { 

    private final GridBagConstraints gbc = new GridBagConstraints(); 

    public GridBagTest(){ 

     setLayout(new GridBagLayout()); 
     add(gbcComponent(0,0,1,2), gbc);  
     add(gbcComponent(1,0,2,1), gbc);    
     add(gbcComponent(1,1,1,1), gbc);    
     add(gbcComponent(2,1,1,1), gbc);    

    } 

    //Returns a JPanel with some component inside it, and sets the GBC fields 
    private JPanel gbcComponent(int x, int y, int w, int h){ 

     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = w; 
     gbc.gridheight = h; 
     gbc.fill = GridBagConstraints.BOTH; 
     JPanel panel = new JPanel(); 
     JTextField text = new JTextField("(" + w + ", " + h + ")"); 
     panel.setBorder(new TitledBorder("(" + x + ", " + y + ")"));   
     panel.add(text); 
     return panel; 

    } 

    public static void main (String args[]){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new GridBagTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

When running it After stretching

我需要它因此在图像2中,内JPanel的控股组件被调整大小以填补GridBagLayout它们各自的宽度和高度,理想的拉伸他们的组件。

回答

7

这通常是由于您没有设置重量和重量限制。

尝试:

gbc.gridx = x; 
gbc.gridy = y; 
gbc.gridwidth = w; 
gbc.gridheight = h; 

// **** add here: 
gbc.weightx = 1.0; 
gbc.weighty = 1.0; 

这将让你的GUI在X和Y方向扩大如果需要的话。

+0

看起来像这样的作品!不能相信我从来没有尝试过。现在有没有什么方法可以让只有一个组件的内部面板具有该组件的尺寸以填充它?即文本字段的宽度是否被拉伸? –

+1

@ adnan_252:是的,但你需要给那些内部的JPanel布局管理器,比如GridBagLayout或BorderLayout,或者......当前你的内部JPanel只使用默认的FlowLayout,而且这个布局非常简单不扩展组件。 –

+0

再次感谢,这已经非常有用! –

0

您可以设置columnWidthsrowHeights调整您的JPanel的大小。 看看这个例子。我修改了您的两列代码案例:

public GridBagTest(){ 

    setLayout(new GridBagLayout()); 
    add(gbcComponent(0,0,1,2), gbc);  
    add(gbcComponent(1,0,1,1), gbc); 

    addComponentListener(new java.awt.event.ComponentAdapter() { 
     @Override 
     public void componentResized(java.awt.event.ComponentEvent evt) { 
      GridBagLayout layout = (GridBagLayout) getLayout(); 
      JPanel panel = (JPanel)evt.getComponent(); 
      int width = panel.getWidth(); 
      int height = panel.getHeight(); 
      int wGap = panel.getInsets().left+panel.getInsets().right; 
      int hGap = panel.getInsets().top+panel.getInsets().bottom; 
      layout.columnWidths = new int[]{width/2-wGap, width/2-wGap}; 
      layout.rowHeights = new int[]{height-hGap}; 
     } 
    }); 

} 

根据您的列和行数,您可以更改它。结果如下: enter image description here enter image description here

相关问题