GridBagLayout: How to set fixed column width?

Marie picture Marie · Jul 16, 2014 · Viewed 19.9k times · Source

I've been trying to set fixed column width in the following code for ages...The thing is that when I add a label to the panel on the left, then the width is incremented automatically...and i Would like the column width to be fixed...

Could anyone help me please??

This is the code:

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import java.io.IOException;

public class CurrentItem extends JPanel{

    private static JFrame currentScreen; 

    public CurrentItem(JFrame p) { 

        GridBagConstraints c = new GridBagConstraints();

        //Borramos todo lo que haya en la pantalla 
        this.removeAll();
        this.revalidate();

        currentScreen = p;     

        this.setBackground(Color.LIGHT_GRAY);      

        this.setLayout(new GridBagLayout());  

        currentScreen.add(this);       

        // --->
        Panel leftPanel = new Panel(); 
        leftPanel.setBackground(Color.BLACK);

        c.weightx = 1.5;
        c.weighty = 1;
        //c.fill = GridBagConstraints.BOTH;      
        this.add(leftPanel, c);
        // <---

        // --->
        Panel secondPanel = new Panel(); 
        secondPanel.setBackground(Color.green);

        c.weightx = 0.25;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;

        this.add(secondPanel, c);
        // <---     

        // --->
        Panel rightPanel = new Panel(); 
        rightPanel.setBackground(Color.CYAN);

        c.weightx = 1.5;
        c.weighty = 1;
        c.fill = GridBagConstraints.BOTH;

        this.add(rightPanel, c);
        // <---

        currentScreen.setVisible(true);

        this.requestFocusInWindow();         
    }
}

Answer

Braj picture Braj · Jul 16, 2014

GridBagLayout places components in rectangles (cells) in a grid, and then uses the components' preferred sizes to determine how big the cells should be.

Weights are used to determine how to distribute space among columns (weightx) and among rows (weighty); this is important for specifying resizing behavior.

Generally weights are specified with 0.0 and 1.0 as the extremes: the numbers in between are used as necessary.

Read more How to Use GridBagLayout


Sample code: (below code set fixed width column with 100% vertical size.)

Panel leftPanel = new Panel() {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};

Remove weightx for first column and override getPreferredSize() method.

leftPanel.setBackground(Color.BLACK);

c.weighty = 1;
c.fill = GridBagConstraints.VERTICAL;
this.add(leftPanel, c);