Very rarely, one layout manager meets all your needs. Instead, you can use the compound layout approach.
That is, separate each individual layout requirement into a separate component with its own layout manager. Then they added all this to their main component, managing the general requirements.
As an example


import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.LineBorder; public class SimpleGridBagLayout { public static void main(String[] args) { new SimpleGridBagLayout(); } public SimpleGridBagLayout() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; add(createLabel("XXX-XXX", Color.BLUE), gbc); JPanel panel = new JPanel(); panel.add(createLabel("YY", Color.RED)); panel.add(createLabel("ZZZZZ---ZZZZZ", Color.GREEN), gbc); gbc.gridx++; gbc.weightx = 1; add(panel, gbc); } protected JLabel createLabel(String text, Color border) { JLabel label = new JLabel(text); label.setBorder(new LineBorder(border)); return label; } @Override public Dimension getPreferredSize() { return new Dimension(200, 100); } } }
There are a number of factors. The preferred and minimum sizes of child components will significantly affect how some layout managers place components there when the available size is small.
Update
public TestPane() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; add(createLabel("XXX-XXX", Color.BLUE), gbc); JPanel panel = new JPanel(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 0; panel.add(createLabel("YY", Color.RED), gbc); gbc.gridx = 1; panel.add(createLabel("ZZZZZ---ZZZZZ", Color.GREEN), gbc); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.weightx = 1; add(panel, gbc); }
Update
Now with a progress bar "not contracting"
public class TestPane extends JPanel { public TestPane() { setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; add(createLabel("XXX-XXX", Color.BLUE), gbc); JPanel panel = new JPanel(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 0; panel.add(createLabel("YY", Color.RED), gbc); gbc.gridx = 1; MyProgressBar pb = new MyProgressBar(); panel.add(pb, gbc); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.weightx = 1; add(panel, gbc); } protected JLabel createLabel(String text, Color border) { JLabel label = new JLabel(text); label.setBorder(new LineBorder(border)); return label; } @Override public Dimension getPreferredSize() { return new Dimension(200, 100); } } public class MyProgressBar extends JProgressBar { @Override public Dimension getPreferredSize() { Dimension ps = super.getPreferredSize(); ps.width = 75; return ps; } @Override public Dimension getMinimumSize() { return getPreferredSize(); } }