如何使用 GridBagLayout 摆脱 Java JTextField 和 JLabel 之间不需要的 space
How can I get rid of the unwanted space between a Java JTextField and a JLabel using the GridBagLayout
使用 Java GridBagLayout 为什么在列前的第一个 JTextField(标记为 A)右侧有一个大的 space,但最后两个 JTextField 的 B 和 C 的行为与预期一致,没有不需要的spaces 在它们之间,如何消除 space?
我在下面附上了一张图片以显示问题以及代码。
/* 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);
gbcRightPanel.weighty = 1;
使面板的倍数/权重为 1.0,因此在放置所有其他元素后剩下的 x 轴上的任何 space 转到第一列。
尝试添加第四列并赋予此列更大的权重。
A GridBagLayout
适用于由 row/columns 组成的单元格。
第一行只有一列。第二行有 5 列。
所以第 1 列的宽度是第一列所有行中最大组件的宽度,它恰好是您的标签,所以您会看到额外的 space。
改变这一点的一种方法是让标签占据 5 列。所以在添加标签之前,您需要使用:
gbcRightPane.gridWidth = 5;
rightPanel.add(labelDitigalTimer, gbcRightPanel);
gbcRightPane.gridWidth = 1; // reset for the other components.
现在标签将出现在所有 5 个组件的上方。然后,您可以通过指定适当的约束来确定是希望标签居中还是左对齐。
阅读有关 How to Use GridBagLayout 的 Swing 教程部分,了解有关约束和工作示例的更多信息。
另一种方法是使用嵌套面板。因此,您可以为文本字段和冒号标签创建一个单独的面板。然后在 GridBagPanel 中添加标签和面板作为两个单独的组件。
阅读本教程中的其他布局管理器,了解每个布局管理器的工作原理,以便您可以有效地嵌套面板以获得所需的布局。
使用 Java GridBagLayout 为什么在列前的第一个 JTextField(标记为 A)右侧有一个大的 space,但最后两个 JTextField 的 B 和 C 的行为与预期一致,没有不需要的spaces 在它们之间,如何消除 space? 我在下面附上了一张图片以显示问题以及代码。
/* 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);
gbcRightPanel.weighty = 1;
使面板的倍数/权重为 1.0,因此在放置所有其他元素后剩下的 x 轴上的任何 space 转到第一列。
尝试添加第四列并赋予此列更大的权重。
A GridBagLayout
适用于由 row/columns 组成的单元格。
第一行只有一列。第二行有 5 列。
所以第 1 列的宽度是第一列所有行中最大组件的宽度,它恰好是您的标签,所以您会看到额外的 space。
改变这一点的一种方法是让标签占据 5 列。所以在添加标签之前,您需要使用:
gbcRightPane.gridWidth = 5;
rightPanel.add(labelDitigalTimer, gbcRightPanel);
gbcRightPane.gridWidth = 1; // reset for the other components.
现在标签将出现在所有 5 个组件的上方。然后,您可以通过指定适当的约束来确定是希望标签居中还是左对齐。
阅读有关 How to Use GridBagLayout 的 Swing 教程部分,了解有关约束和工作示例的更多信息。
另一种方法是使用嵌套面板。因此,您可以为文本字段和冒号标签创建一个单独的面板。然后在 GridBagPanel 中添加标签和面板作为两个单独的组件。
阅读本教程中的其他布局管理器,了解每个布局管理器的工作原理,以便您可以有效地嵌套面板以获得所需的布局。