当前位置: 首页 > 知识库问答 >
问题:

GridBagLayout向列添加额外空间

张鸿志
2023-03-14

我有一个JBoardGridBagLayout作为布局管理器,我正在尝试获得这种安排:

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

我总共有5列和3行,所有组件都将设置PreferredSize()设置为精确值,以完全适合同样具有首选大小(170 x 115)的JPanel。

问题是GridBagLayout似乎在最后一列宽度上添加了30 pxls,因为仅在JBoard的宽度上添加了30 pxls(总共200个)组件显示正确,如下所示:

但由于额外的空间,最后一列被分隔开了。

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

根据我的经验,它告诉我可用空间太小,无法显示所有组件,然后使用set最小尺寸()

我不知道那30个PXL是从哪里来的,有人能告诉我如何使这些部件合适吗?

代码如下所示,当前给出此结果:

忽略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));
    }
}

提前感谢。

共有1个答案

卢杰
2023-03-14

我一共有5列

我看不出来。不能只将组件指定给列。实际上,您需要在一行中包含5个组件才能创建包含5列的网格。

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

所以根据你的照片,你需要重新思考你的设计。我看到的是:

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

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

 类似资料:
  • 嗨,我正在尝试重新创建一个足球锦标赛,已经能够创建一个地图的集团,但现在想要添加到每个国家的点数。有人有什么好主意吗?请看看我已经做了什么。

  • 我在Swing工作了很长时间,终于找到了学习GridBadLayout的自信。 我仍在学习它,在这种情况下,我不明白为什么以下代码没有按预期响应:特别是我不明白为什么布局以这种方式显示列。 通过运行代码片段,您将发现代表意大利国旗的面板没有正确定位:最后一列(国旗的红色部分)与国旗的其余部分(国旗的白色部分)分离。那么,我做错了什么?为了正确地代表国旗,我可以修正什么? 除了了解这个特定问题及其原

  • 我有一个文件,其中包含以下数据: 我正在尝试插入一个名为“Date”的列作为第一列。 我使用的进出口商品如下: 但上述情况并没有如预期的那样起作用。它正在替换列数据。

  • 我正在尝试将Gradle(1.4)添加到一个现有的项目中,该项目有多个测试套件。位于中的标准单元测试成功运行,但我在设置任务以运行位于中的JUnit测试时遇到了麻烦。 当我运行时,对于中的类,我遇到了几个错误。这使我认为依赖项设置不正确。如何设置以便它运行我的JUnit集成测试? Build.Gradle 细节:1.4级 解决方案:我没有为集成测试源集设置编译类路径(参见下面)。在我的I代码中,我

  • 问题内容: 我想用三个表的联合创建视图。但是在结果查询中,我想要一个额外的列,例如“ tableId”。 我的代码就像 这给了我所需的三个表的并集。但是如何获取结果输出中的表ID列?该列在三个表中都不存在。 问题答案: 这听起来像你只是想一个额外的硬编码值添加到您的列表

  • 我在这里看到了一些例子:http://docs.oracle.com/javase/7/docs/api/javax/swing/joptionpane.html 它似乎表明我应该用一个自定义的按钮列表来替换我的组合框,这不是我想要的。我需要有3个按钮(好的,跳过,取消),以及项目列表。 更新:为了说明我的GUI应该是什么样子: null 目前我的代码如下所示: 灵感来自:Java:showInp