如何垂直对齐 JLabel-JTextField 对

Posted

技术标签:

【中文标题】如何垂直对齐 JLabel-JTextField 对【英文标题】:How to align JLabel-JTextField pairs vertically 【发布时间】:2011-08-25 16:53:44 【问题描述】:

我所说的 JLabel-JTextField 对是指一个 JLabel 组件后跟一个 JTextField 组件,例如“参数 1:-----”,其中“-----”表示空白 JTextField。

问题是,JLabels 的宽度因参数名称的长度不同而不同,因此 JTextField 的开头没有垂直对齐。

有什么方法可以将 JLabels 垂直对齐到它们的右侧,以便随后的 JTextFields 的开头对齐?谢谢。

【问题讨论】:

这是MiGLayout的一个很好的例子,如果依赖是可以接受的。 或来自 jgoodies 的 FormLayout 【参考方案1】:

有没有办法让 JLabel 垂直对齐到它们的右侧,以便对齐后面的 JTextFields 的开头?

1.6+,GroupLayout。例如。来自 JavaDocs:

使用将文本推送到 RHS 的标签对齐方式。


有关 MCVE,另请参阅 this answer。

【讨论】:

【参考方案2】:

您没有指定您使用哪种布局,所以一个好的布局应该是GridBagLayout。 demo in oracle site 非常适合开始使用。

还有一个简短的例子:

JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
panel.add(new JLabel("Label 1:"), c);
c.gridx = 1;
c.gridy = 0;
panel.add(new JTextField("TextField 1"), c);
c.gridx = 0;
c.gridy = 1;
panel.add(new JLabel("Label 2:"), c);
c.gridx = 1;
c.gridy = 1;
panel.add(new JTextField("TextField 2"), c);

【讨论】:

+1,但他们很快就会抱怨在调整 GUI 大小时组件会在中间堆积。不要忘记 weightx 和 weighty。 :) 这种方法很好地嵌套为一个LabelTextPanel(具有GridBagLayout),用于GridLayout 中的每一行。【参考方案3】:

可以将 JTextComponents 中的文本与

对齐
JLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);

【讨论】:

+1 另见example。 嗯,这很好,与如何使用 BorderLayout 创建 10 像素的 EmptyBorder 相同...(将 JComponents 放置在 CENTER 位置周围,无需任何尺寸)【参考方案4】:

这是DesignGridLayout 的完美用例:

DesignGridLayout layout = new DesignGridLayout(contentPane);
layout.labelAlignment(LabelAlignment.RIGHT);
layout.row().grid(label1).add(field1);
layout.row().grid(label2).add(field2);
...

【讨论】:

它不是标准库的一部分 @user1885518 OP 没有提到它必须是标准库的一部分。【参考方案5】:

我建议使用GridLayout 布局管理器。它提供了显示标签和文本框控件的成对可视化的最简单的解决方案。因此,您只需在实例化时定义行数和列数,添加的控件将由管理器处理。

【讨论】:

但是标签和文本字段被强制为相同大小,通常会导致 GUI 非常难看。我建议不要使用它。 @Hovercraft 是正确的,尽管如果标签和字段的大小相当并且与 @mKorbel 的 answer 一起使用时,这可以工作。【参考方案6】:

我见过的很好的解决方案包括使用 GridBagLayout(如上所述)或 MiGLayout,但由于后者不是标准 Java 的一部分,因此必须先下载并放置在类路径中使用。 MiGLayout 没有那么难用。

【讨论】:

【参考方案7】:

父组件的LayoutManager负责定位所包含的元素。也许你需要设置一个 XYLayout。

查看父类的 setLayoutManager()。

【讨论】:

-1,XYLayout 不是标准布局,不应鼓励基于绝对定位的布局管理器,因为它们不是真正的布局管理器。

以上是关于如何垂直对齐 JLabel-JTextField 对的主要内容,如果未能解决你的问题,请参考以下文章

Godot:如何垂直对齐bbcode

如何垂直对齐段落中心

如何垂直对齐2种不同大小的文本?

如何垂直或水平对齐定向文本?

如何在引导程序中使用垂直对齐

如何垂直居中对齐位置:相对元素?