J.Dupla
J.Dupla

Reputation: 65

GridLayout doesn't fill up the entire window

Whats the reason that a JInteralFrame with a GridLayout(x, y) doesn't fill up the entire window although I'm adding x*y buttons to it? Why is there white space around it like in the first picture below?

If i resize it a bit, I'm able to remove all the white space around the grid layout, like in the second picture below, but I do not understand why that's not always the case.

with a white frame around it

no white frame

Upvotes: 0

Views: 945

Answers (2)

camickr
camickr

Reputation: 324098

Why is there white space around it like in the first picture below?

Andrew's answer explains the problem with the GridLayout.

However I don't know if this can be fixed with any of the other standard JDK layout managers.

Check out the Relative Layout. It is a layout manager that allows you to give components a size relative to one another, so it is easy to make all components the same size. When there are extra pixels you can set the "rounding policy" to allocate the pixels to different components.

The layout is a little more complex because it can't be done with a single layout manager. In the example below you need a panel that uses the RelativeLayout for vertical layout. Then you need to create a separate panel for each row and those panels will use a RelativeLayout with a horizontal layout.

import java.awt.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    SSCCE()
    {
        int size = 10;
        setBackground( Color.RED );

        Float constraint = new Float(1.0f);
        RelativeLayout vertical = new RelativeLayout(RelativeLayout.Y_AXIS);
        vertical.setRoundingPolicy( RelativeLayout.EQUAL );
        vertical.setFill(true);
        setLayout( vertical );

        for (int i = 0; i < size; i++)
        {
            RelativeLayout horizontal = new RelativeLayout(RelativeLayout.X_AXIS);
            horizontal.setRoundingPolicy( RelativeLayout.EQUAL );
            horizontal.setFill(true);
            JPanel row = new JPanel( horizontal );

            for (int j = 0; j < size; j++)
            {
                row.add(new JButton(), constraint);
            }

            add(row, constraint);
        }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

Upvotes: 1

Andrew Thompson
Andrew Thompson

Reputation: 168815

Why is there white space around it like in the first picture below?

A GridLayout assigns exactly the same width or height to every component, but for a GUI 20 (for example) components wide, it is only possible to do that every 20 pixels that the GUI is stretched. It arranges any 'left over' pixels of space to the left and right most components.

To get around that, you might instead use a GridBagLayout and adjust the weights of rows and columns to allow some components to take over the remaining space in a way that is almost unnoticeable (the difference in component sizes) to the user.

Upvotes: 1

Related Questions