Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GridBagLayout padding

I am using a GridBagLayout to (currently) display two rows. I am aware this layout is overkill for this task, but am trying to learn how to use it. The problem is that I have added the two panels to the two separate rows and there is a huge gap around the content (see image and code below): alt text http://www.imagechicken.com/uploads/1264533379009864500.png

Image background;
    public Table(){
        super();
        ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png"));
        background = ii.getImage();
        setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT);

        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.fill = GridBagConstraints.HORIZONTAL;

        JButton button = new JButton("hello world");
        JPanel panel1 = new JPanel();
        panel1.setPreferredSize(new Dimension(800,100));
        panel1.add(button, BorderLayout.CENTER);
        panel1.setBackground(Color.yellow);
        add(panel1, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;

        JPanel middlePanel = new JPanel();
        middlePanel.setPreferredSize(new Dimension(800,350));
        middlePanel.add(button, BorderLayout.CENTER);
        middlePanel.setBackground(Color.blue);
        add(middlePanel, constraints);


    }
like image 506
Aly Avatar asked May 18 '26 22:05

Aly


2 Answers

Use

constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1d;
constraints.weighty = 1d;

JavaDoc for weightx/weighty says:

Specifies how to distribute extra horizontal/vertical space.

JavaDoc for fill:

This field is used when the component's display area is larger than the component's requested size. It determines whether to resize the component, and if so, how.

like image 87
Peter Lang Avatar answered May 21 '26 18:05

Peter Lang


Unfortunately, with GridBagLayout, if the contents do not fill the entire container that it is in, it will automatically center all its contents within its container. That is why you are getting a really large gap.

There are essentially two ways to fix this:

  1. The hard way: Fiddle with the GridBagConstraints. I had limited success with this when trying to avoid the centre-ing behaviour.
  2. The easy way: Put the GridBagLayout inside of a FlowLayout, and then set the alignment of the FlowLayout to top-left, or whatever you wish.

I have asked, and answered, this question myself sometime last week.

So in your case you are adding your panel1 and middlePanel directly to the JFrame (?), with a GridBagLayout

JFrame (GridBagLayout)
 - panel1
 - middlePanel

I would suggest this alternative structure instead, to get rid of all the extra space (and centre alignment as well, if you like).

JFrame (FlowLayout)
 - JPanel (GridBagLayout)
   - panel1
   - middlePanel

HTH

like image 25
bguiz Avatar answered May 21 '26 17:05

bguiz



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!