Search code examples
javaswinglayout-managergridbaglayout

Making a component span multiple rows with GridBagLayout


I want to make the blue component fill the white gap. I tried to use the gridheight = 2 and nothing happened. The way I see it is that there are three cells and I want the component to expand into a fourth cell which is not present. How can I get around it?

enter image description here

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GUIFrame extends JFrame 
{

public GUIFrame(String title)
{
    super(title);
}

public void init()
{
    setLayout(new GridBagLayout());
    GridBagConstraints gbConstraints = new GridBagConstraints();

    DisplayPanel display = new DisplayPanel();
    ControlPanel control = new ControlPanel();
    GalleryPanel gallery = new GalleryPanel();


    gbConstraints.gridx = 0;
    gbConstraints.gridy = 0;
    gbConstraints.weightx = 0.8;
    gbConstraints.weighty = 0.75;
    gbConstraints.fill=gbConstraints.BOTH;
    add(display,gbConstraints);

    gbConstraints.gridx = 1;
    gbConstraints.gridy = 0;
    gbConstraints.weightx = 0.2;
    gbConstraints.weighty = 0.75;
    gbConstraints.fill=gbConstraints.BOTH;
    add(gallery,gbConstraints);


    gbConstraints.gridx = 0;
    gbConstraints.gridy = 1;
    gbConstraints.weightx = 1;
    gbConstraints.weighty = 0.3;
    gbConstraints.fill=gbConstraints.BOTH;
    add(control,gbConstraints);




    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(1600,900);
    setVisible(true);
}


}

Solution

  • The adjustment criteria is simple:

       Grid Height = 1       
    -----------------------
    |   0.7 width   | 0.3 |-----> Grid Height = 2
    |   0.7 height  | w   |
    ----------------| 1.0 |
    |   0.7 w 0.3 h |  h  |
    -----------------------
            |
        Grid Height = 1
    

    Here is a working example:

    import java.awt.*;
    import javax.swing.*;
    
    public class GridBagLayoutExample {
    
        private final int hGap = 5;
        private final int vGap = 5;
    
        private GridBagConstraints gbc;
    
        public GridBagLayoutExample () {
            gbc = new GridBagConstraints ();
            gbc.anchor = GridBagConstraints.FIRST_LINE_START;   
            gbc.insets = new Insets( hGap, vGap, hGap, vGap ); 
        }
    
        private void displayGUI () {
            JFrame frame = new JFrame ( "GridBagLayout Example" );
            frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
    
            JPanel contentPane = getPanel ( Color.WHITE );
            contentPane.setLayout ( new GridBagLayout () );
    
            JPanel blackPanel = getPanel ( Color.BLACK );
            addComp ( contentPane, blackPanel, 0, 0, 1, 1
                                , GridBagConstraints.BOTH, 0.7, 0.7 );
    
            JPanel grayPanel = getPanel ( Color.GRAY );
            addComp ( contentPane, grayPanel, 0, 1, 1, 1
                                , GridBagConstraints.BOTH, 0.7, 0.3 );
    
            JPanel bluePanel = getPanel ( Color.BLUE );
            addComp ( contentPane, bluePanel, 1, 0, 1, 2
                                , GridBagConstraints.BOTH, 0.3, 1.0 );
    
            frame.setContentPane ( contentPane );
            frame.pack ();
            frame.setLocationByPlatform ( true );
            frame.setVisible ( true );
        }
    
        private void addComp(JPanel panel, JComponent comp
                                    , int x, int y, int gWidth
                                        , int gHeight, int fill
                                            , double weightx, double weighty) {
            gbc.gridx = x;
            gbc.gridy = y;
            gbc.gridwidth = gWidth;
            gbc.gridheight = gHeight;
            gbc.fill = fill;
            gbc.weightx = weightx;
            gbc.weighty = weighty;      
    
            panel.add(comp, gbc);
        }
    
        private JPanel getPanel ( Color bColor ) {
            JPanel panel = new JPanel();
            panel.setOpaque ( true );
            panel.setBackground ( bColor );
    
            return panel;
        }
    
        public static void main ( String [] args ) {
            Runnable runnable = new Runnable () {
                @Override
                public void run () {
                    new GridBagLayoutExample ().displayGUI ();
                }
            };
            EventQueue.invokeLater ( runnable );
        }
    }