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);
}
}
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.
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? –
@ 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. –
nochmals vielen Dank, das war wirklich nützlich! –