【问题标题】:GridBagLayout adding extra space to columnGridBagLayout 为列添加额外空间
【发布时间】:2019-02-27 02:59:01
【问题描述】:

我有一个JPanelGridBagLayout 作为布局管理器,我正在尝试进行这种安排:

忽略边框的额外深蓝色空间。

我总共有 5 列和 3 行,所有组件都将 setPreferredSize() 设置为精确值,以完全适合 JPanel,它也有首选尺寸 (170 x 115)。

问题在于GridBagLayout 似乎在最后一列宽度上增加了 30 pxls,因为只在JPanel 的宽度上增加了 30 pxls(总共 200 个)组件才能正确显示,如下所示:

但由于多余的空间,最后一列分开了。

它增加了 30 pxls,因为将 29 pxls 添加到 JPanel 的宽度会得到以下结果:

根据我的经验,可用空间太小而无法显示所有组件,然后使用setMinimumSize()

我不知道那 30 pxls 是从哪里来的,请谁能告诉我如何使组件适合?

代码如下所示,目前给出了这个结果:

忽略JFrame的多余黑色空间。

您可以在第 34 行更改 JPanel 的宽度。

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class Test{
    public static void main (String[] args){
        JFrame f;
        SizeProperties p;

        f = new JFrame();
        p = new SizeProperties();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setPreferredSize(new Dimension(250,200));
        f.getContentPane().setBackground(Color.BLACK);
        f.setLayout(new FlowLayout());

        f.add(p);
        f.pack();
        f.setVisible(true);
    }
}

final class SizeProperties extends JPanel{
    private GridBagConstraints c;
    private PropertiesLabel xL,yL,wL,hL;
    private PropertiesField xF,yF,wF,hF;
    private ProportionToggleButton ptb;

    SizeProperties(){
        setBackground(new Color(18,101,142));
        setPreferredSize(new Dimension(170,115));//Change width here
        setLayout(new GridBagLayout());

        xL = new PropertiesLabel("x:",25,25);
        xF = new PropertiesField();
        yL = new PropertiesLabel("y:",25,25);
        yF = new PropertiesField();
        wL = new PropertiesLabel("Width:",80,25);
        wF = new PropertiesField();
        hL = new PropertiesLabel("Height:",80,25);
        hF = new PropertiesField();
        ptb = new ProportionToggleButton();

        c = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,10,10,0),0,0);
        add(xL,c);

        c = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
        add(xF,c);

        c = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,0),0,0);
        add(yL,c);

        c = new GridBagConstraints(3,0,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(10,0,10,10),0,0);
        add(yF,c);

        c = new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
        add(wL,c);

        c = new GridBagConstraints(2,1,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(wF,c);

        c = new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,10,10,0),0,0);
        add(hL,c);

        c = new GridBagConstraints(2,2,2,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(hF,c);

        c = new GridBagConstraints(4,1,1,2,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(0,0,10,10),0,0);
        add(ptb,c);

    }
}

final class PropertiesLabel extends JLabel{
    PropertiesLabel(String label,int w,int h){
        setText(label);
        setPreferredSize(new Dimension(w,h));
        setBackground(Color.BLACK);
        setOpaque(true);
        setForeground(Color.WHITE);
        setFont(new Font("SansSerif",Font.PLAIN,14));
        setHorizontalAlignment(SwingConstants.CENTER);
        setVerticalAlignment(SwingConstants.CENTER);
    }
}

final class PropertiesField extends JTextField{
    private int validNumber = 0;

    PropertiesField(){
        setPreferredSize(new Dimension(45,25));
        setBackground(new Color(202,226,255));
        setForeground(Color.BLACK);
        setFont(new Font("SansSerif",Font.PLAIN,14));
        setHorizontalAlignment(JTextField.CENTER);
        setText("999");
    }
}

final class ProportionToggleButton extends JToggleButton{
    ProportionToggleButton(){
        setPreferredSize(new Dimension(15,60));
    }
}

提前致谢。

【问题讨论】:

    标签: java swing gridbaglayout


    【解决方案1】:

    我总共有 5 列

    不是我能看到的。您不能只将组件分配给列。您实际上需要在单行中有 5 个组件才能创建 5 列的网格。

    根据您的图片,您的第一行有 4 列,最后两行有 3 列。

    因此,根据您的图片,您需要重新考虑您的设计。我看到的是:

    1. 根据最后两行,您有三列。
    2. 现在在第一行,x/999 将是一个带有两个组件的面板。此面板将位于第一列(带有宽度/高度标签)。
    3. 此外,在第一行中,y/999 将是一个包含两个组件的面板,将从第二列开始,网格宽度为 2。
    4. 第 2 行和第 3 行将包含第二列中的 999 组件
    5. 按钮从第 2 行开始,网格高度为 2,将包含在第 3 列中

    此外,您不应设置组件的首选大小。每个组件将确定其自己的首选尺寸。然后 GridBagLayout 将根据行/列中的组件确定每个单元格的大小。

    【讨论】:

    • 所以让我直截了当地说: 1. 网格宽度和网格高度不计入确定列数和行数。 2. 列数和行数由它包含的最大组件数决定
    • 另外,如果我不设置首选大小,单元格的大小不是都一样吗?我的意思是没有什么能告诉他们要多大。
    • 我刚刚测试了您建议的修改并且它有效!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2018-08-08
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多