Consider changing the GridBagConstraint fill field for BOTH for panel2:
panel2.setBorder(new TitledBorder("P2")); c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH;
Either this, or for a much simpler solution, just use BorderLayout instead:
panel.setBorder(new LineBorder(Color.RED)); panel.setLayout(new BorderLayout()); JPanel panel1 = new JPanel(); panel1.add(new JLabel(" Testing Label 1 ")); panel1.setBorder(new TitledBorder("P1")); panel.add(panel1, BorderLayout.NORTH); JPanel panel2 = new JPanel(); panel2.add(new JLabel(" Testing Label 2")); panel2.setBorder(new TitledBorder("P2")); panel.add(panel2, BorderLayout.CENTER); JPanel panel3 = new JPanel(); panel3.setBorder(new TitledBorder("P3")); panel3.setLayout(new GridLayout(5, 1)); for (int i = 0; i < 5; i++) { panel3.add(new JButton("button " + i)); } panel.add(panel3, BorderLayout.SOUTH);
source share