2014-07-13 285 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

相關問題