GridBagLayout: How to set fixed column width?
awt, gridbaglayout, java, swing
Solution
`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);
Problem
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(); } } ```