У меня есть JFrame
, чей корень JPanel
создается с помощью GridBagLayout
. Во время выполнения панель заполняется компонентами на основе некоторого описания, а ширина, высота и координаты x,y указываются в описании для использования с полями gridwidth
, gridheight
, gridx
и gridy
в GridBagConstraints
. Сами компоненты также могут быть JPanel
с собственными дочерними компонентами и GridBagConstraints
, графический интерфейс описывается в виде дерева, поэтому фрейм заполняется рекурсивно.
Проблема, с которой я сталкиваюсь, заключается в том, что при изменении размера фрейма внутренние компоненты не растягиваются, чтобы заполнить заданную ширину и высоту. Ниже я привел пример кода макета со скриншотами.
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);
}
}
Мне это нужно, поэтому на рисунке 2 внутренние JPanel
, содержащие компоненты, изменяются, чтобы заполнить их соответствующие ширину и высоту на GridBagLayout
, в идеале также растягивая их компоненты.