如何垂直对齐 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 对的主要内容,如果未能解决你的问题,请参考以下文章