GridBagLayout: How to set fixed column width?

22,038

Solution 1

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);

Solution 2

If you know ahead of time the labels that you'll be adding, and how wide each one is:

  • You can call label.getPreferredSize().width on each label to determine the width of the largest label.

  • Then, add an invisible component (Box.createHorizontalStrut(width)) to the column to force it to be that wide at all times.

  • Then, when you add all of your labels, the width of that column of the panel will not change.

Share:
22,038
Marie
Author by

Marie

Updated on July 02, 2020

Comments

  • Marie
    Marie about 4 years

    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();         
        }
    }