Имам JFrame
, чийто корен JPanel
е инстанциран с GridBagLayout
. По време на изпълнение панелът се попълва с компоненти въз основа на някакво описание, а ширината, височината и координатите x,y са дадени в описанието, което се използва с полетата gridwidth
, gridheight
, gridx
и gridy
в GridBagConstraints
. Самите компоненти също могат да бъдат JPanel
s със собствени дъщерни компоненти и GridBagConstraints
, GUI е описан в дърво, така че Frame се попълва рекурсивно.
Проблемът, който имам, е, че когато рамката се преоразмерява, вътрешните компоненти не се разтягат, за да запълнят дадените им ширини и височини. Дадох пример за кода на оформлението по-долу, с екранни снимки.
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
, като в идеалния случай също разтягат и компонентите си.