2014-07-13 9 views
6

Ich habe eine JFrame, deren Wurzel JPanel mit einem GridBagLayout instanziiert ist. Zur Laufzeit wird das Panel mit Komponenten bestückt, die auf einer Beschreibung basieren, und die Breite, Höhe und x, y-Koordinaten sind in der Beschreibung für die Felder gridwidth, und gridy in GridBagConstraints angegeben. Die Komponenten selbst können auch JPanel s mit ihren eigenen untergeordneten Komponenten sein und GridBagConstraints, die GUI wird in einem Baum beschrieben, so dass Frame rekursiv bevölkert wird.Können Komponenten eines Gitternetzlayouts den Elternrahmen bei der Größenanpassung füllen?

Das Problem, das ich habe, ist, dass wenn die Größe des Rahmens geändert wird, die inneren Komponenten nicht gestreckt werden, um ihre gegebenen Breiten und Höhen zu füllen. Ich habe ein Beispiel für den Layout-Code unten mit Screenshots gegeben.

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

Ich brauche es so in Abbildung 2, ist die innere JPanel s, die Komponenten halten, sind die Größe verändert ihre jeweiligen Breiten und Höhen auf den GridBagLayout zu füllen, im Idealfall auch ihre Komponenten Recken.

Antwort

7

Dies liegt normalerweise daran, dass Sie keine gewichtigen und gewichtigen Einschränkungen festlegen.

Versuche:

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

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

Dies ermöglicht Ihrem GUI in der x- und y-Richtung zu erweitern, wenn es sein muss.

+0

Sieht so aus als ob das funktioniert! Ich kann nicht glauben, dass ich es noch nie zuvor versucht habe. Gibt es nun eine Möglichkeit, dass innere Paneele, die nur eine Komponente haben, diese Größe haben, um sie zu füllen? d.h. die Breiten der Textfelder sind gestreckt? –

+1

@ adnan_252: Ja, aber Sie müssen diese inneren JPanels Layout-Manager, die dies zulassen, wie GridBagLayout oder BorderLayout, oder ... Derzeit verwenden Ihre inneren JPanels nur die Standard-FlowLayout, und dieses Layout ist recht einfach und tut Teile nicht ausstrecken. –

+0

nochmals vielen Dank, das war wirklich nützlich! –

0

Sie können columnWidths und rowHeights auf die Größe Ihres JPanel einstellen. Schauen Sie sich dieses Beispiel an. Ich änderte den Code für zwei Spalten Fall:

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}; 
     } 
    }); 

} 

Je nach Spalten und Zeilen zählen, können Sie es ändern können. Hier ist das Ergebnis: enter image description here enter image description here

Verwandte Themen