【问题标题】:How can I get rid of the unwanted space between a Java JTextField and a JLabel using the GridBagLayout如何使用 GridBagLayout 摆脱 Java JTextField 和 JLabel 之间不需要的空间
【发布时间】:2016-12-18 19:03:37
【问题描述】:

使用 Java GridBagLayout 为什么在列之前的第一个 JTextField(标记为 A)的右侧有很大的空间,但最后两个 JTextField 的 B 和 C 的行为与预期的一样,它们之间没有不需要的空格,我怎样才能消除空间? 我在下面附上了一张图片来显示问题以及代码。

    /* Label digital timer */
    gbcRightPanel.gridx = 0;
    gbcRightPanel.gridy = 0;
    rightPanel.add(labelDitigalTimer, gbcRightPanel);

    /* Text Field Hours */
    gbcRightPanel.gridx = 0;
    gbcRightPanel.gridy = 1;
    gbcRightPanel.weighty = 1;
    rightPanel.add(jtxtFieldHours, gbcRightPanel);

    /* Label colon */
    gbcRightPanel.gridx = 1;
    gbcRightPanel.gridy = 1;
    rightPanel.add(new JLabel(":"), gbcRightPanel);

    /* Text Field Minuites */
    gbcRightPanel.gridx = 2;
    gbcRightPanel.gridy = 1;
    rightPanel.add(jtxtFieldMinuites, gbcRightPanel);

    /*Colon*/
    gbcRightPanel.gridx = 3;
    gbcRightPanel.gridy = 1;
    rightPanel.add(new JLabel(":"), gbcRightPanel);

    /* Text Field Seconds */
    gbcRightPanel.gridx = 4;
    gbcRightPanel.gridy = 1;
    rightPanel.add(jtxtFieldSeconds, gbcRightPanel);    

【问题讨论】:

  • 如果答案不能解决您的问题,请发布有效的SSCCE

标签: java jlabel jtextfield gridbaglayout


【解决方案1】:

GridBagLayout 适用于由行/列组成的单元格。

第一行只有一列。第二行有 5 列。

因此,第 1 列的宽度是第一列所有行中最大组件的宽度,这恰好是您的标签,因此您会看到额外的空间。

改变这种情况的一种方法是让标签占据 5 列。所以在添加标签之前需要用到:

gbcRightPane.gridWidth = 5;
rightPanel.add(labelDitigalTimer, gbcRightPanel);
gbcRightPane.gridWidth = 1; // reset for the other components.

现在标签将出现在所有 5 个组件的上方。然后,您可以通过指定适当的约束来确定标签是居中还是左对齐。

阅读 How to Use GridBagLayout 上的 Swing 教程部分,了解有关约束和工作示例的更多信息。

另一种方法是使用嵌套面板。因此,您可以为文本字段和冒号标签创建一个单独的面板。然后在 GridBagPanel 中添加标签和面板作为两个独立的组件。

阅读本教程中的其他布局管理器,了解每个布局管理器如何工作,您可以有效地嵌套面板以获得所需的布局。

【讨论】:

  • 您将标签的网格宽度设置为 5 并重置其他组件的网格宽度的解决方案有效。第一行如何有单列,第二行有 5?还是您的意思是为第一行设置的 gridWidth 将决定创建的任何后续行的宽度?还是您指的是我的具体情况?
  • @FlashspeedIfe,使用建议的解决方案,第一行有一个组件,该组件跨越第二行前 5 列的宽度。由于第二行只有 5 个组件,因此第一行的组件跨越了第二行的所有组件。阅读教程并使用示例代码。
【解决方案2】:
gbcRightPanel.weighty = 1;

使面板的乘数/权重为 1.0,因此在放置所有其他元素后剩余的 x 轴上的任何空间都转到第一列。

尝试添加第四列并赋予该列更大的权重。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2014-10-14
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多