GridBagLayout:如何设置固定列宽?

Posted

技术标签:

【中文标题】GridBagLayout:如何设置固定列宽?【英文标题】:GridBagLayout: How to set fixed column width? 【发布时间】:2014-09-06 23:07:36 【问题描述】:

多年来,我一直在尝试在以下代码中设置固定列宽...问题是,当我向左侧面板添加标签时,宽度会自动增加...我会像要固定的列宽...

有人可以帮帮我吗?

这是代码:

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

【问题讨论】:

不要使用Panel,这是一个 AWT 组件。使用 JPanel 这是 Swing 组件。 不要添加这些巨大的import 语句,您应该添加一个main 方法,以便有人尝试使用 【参考方案1】:

GridBagLayout 将组件放置在网格中的矩形(单元格)中,然后使用组件的首选尺寸来确定单元格的大小。

权重用于确定如何在列之间(weightx)和行之间(weighty)分配空间;这对于指定调整大小行为很重要。

通常将权重指定为 0.0 和 1.0 作为极值:根据需要使用中间的数字。

阅读更多How to Use GridBagLayout


示例代码:(以下代码设置固定宽度列,垂直大小为 100%。)

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

删除第一列的weightx 并覆盖getPreferredSize() 方法。

leftPanel.setBackground(Color.BLACK);

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

【讨论】:

【参考方案2】:

如果您提前知道要添加的标签以及每个标签的宽度:

您可以在每个标签上调用label.getPreferredSize().width来确定最大标签的宽度。

然后,在列中添加一个不可见的组件 (Box.createHorizontalStrut(width)) 以强制其始终保持这么宽。

然后,当您添加所有标签时,面板的该列的宽度不会改变。

【讨论】:

以上是关于GridBagLayout:如何设置固定列宽?的主要内容,如果未能解决你的问题,请参考以下文章

如何固定VFP的grid的列宽

EXCEL里面如何设置能把行高和列宽的长度固定?

fastreport中列宽固定 根据字段内容多少自动调整行高

java gridbaglayout 一个组件变化会影响其它组件的大小,能不能做一个设置能让每个组件的大小和位置固定呢

将数据从 Excel 导入 Outlook 时如何设置固定列宽?

fastreport中列宽固定 根据字段内容多少自动调整行高