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

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

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

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

【问题讨论】:

  • 这是MiGLayout的一个很好的例子,如果依赖是可以接受的。
  • 或来自 jgoodies 的 FormLayout

标签: java swing user-interface alignment


【解决方案1】:

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

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

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


有关 MCVE,另请参阅 this answer

【讨论】:

    【解决方案2】:

    您没有指定您使用哪种布局,所以一个好的布局应该是GridBagLayoutdemo 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 不是标准布局,不应鼓励基于绝对定位的布局管理器,因为它们不是真正的布局管理器。
      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多