【问题标题】:Layout managers to set this specific layout in java布局管理器在java中设置这个特定的布局
【发布时间】:2013-10-08 02:49:37
【问题描述】:

我有这个布局,我需要为分配进行编程,这是我第一次在 GUI 中使用布局管理器,所以我在让布局匹配时遇到了问题。我需要你的帮助

我有两个标记为帐户创建和帐户转移的选项卡(这些都可以)我需要的是在一行中有 JLabel(帐户 ID)和第一个文本字段,然后是下一个 JLabel(金额)和文本字段线下第一。在此之下需要以 JButton 为中心(创建帐户)。最后,JTextArea(无帐户)需要位于与标签、文本字段和按钮分开的空白区域右侧的一列中。

这是我开始使用的代码:

public CreatePanel(Vector accountList, TransferPanel transferPanel)
{
this.accountList = accountList;
this.transferPanel = transferPanel;

JLabel l1 = new JLabel("Account ID");
JTextField t1 = new JTextField();
JLabel l2 = new JLabel("Amount");
JTextField t2 = new JTextField();
JButton b1 = new JButton("Create an Account");
JTextArea a1 = new JTextArea("No Account");

JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(2,3));
panel1.add(l1);
panel1.add(t1);
panel1.add(l2);
panel1.add(t2);
panel1.add(b1, BorderLayout.SOUTH);
b1.setVerticalAlignment(JLabel.CENTER);


JPanel panel2 = new JPanel();
panel2.add(a1);
a1.setSize(200, 300);

add(panel1);
add(panel2);
}

【问题讨论】:

标签: java swing user-interface layout-manager


【解决方案1】:

GridBagLayout 是最强大的布局,您可以使用它轻松实现类似网格的显示。这是一个包含n 行和m 列的布局,其中每个单元格都可以在多个方面独立于其他单元格进行自定义。在此布局中,您必须将GridBagConstraints 对象作为约束附加到每个panel.add(JComponent, Constraints)。在tutorial 中明确指定了可定制的内容。一开始它可能看起来有点苛刻,但一旦你掌握了它,它就很棒。它功能强大且灵活,您不必担心其他布局可能会遇到不可自定义的限制。

在您的布局中,我看到的最不方便的事情是“帐户 ID”标签的中心与 TextField AND 对齐,并且两者上方都有空白区域。如果标签与 TextField 的底部对齐会更容易。为了解决这个问题,我假设 Label 和 TextField 位于我事先构建的面板内,该面板彼此正确对齐(很容易与 BorderLayout 或 GridBagLayout ......或任何其他东西),我只需将面板放在布局中。

然后我将此布局视为具有 3 行和 2 列的 GridBagLayout,如下所示:

这是我如何放置约束以指定布局中的每个组件的概述

面板 1(帐户 ID 标签 + 文本字段)

gridx = 0
gridy = 0
weighty = 0.5
weightx = 0.5
anchor = PAGE_END
fill = HORIZONTAL

面板 2(金额标签 + 文本字段)

gridx = 0
gridy = 1
weighty = 0.0
fill = HORIZONTAL

按钮

gridx = 0
gridy = 2
anchor = PAGE_START
weighty = 0.5

文本区域

gridx = 1
gridy = 0
gridheight = 3
weightx = 0.5
fill = BOTH

我忽略了一些细节,但可以通过这些限制来解决核心问题。要了解GridBagLayout 最不明显的事情是权重在复杂情况下如何工作,例如当同一列中有多个不同的weightx 值时会发生什么。它计算最大值吗?还是总和?...

为了便于讨论,您可以避免让这些面板使用带有weighty > 0 的不可见组件的额外初始行,然后有两列:一列用于JLabels,另一列用于JTextField s,适当的anchors;按钮应该有gridwith = 2...但这完全没有必要,去两个辅助面板吧。

【讨论】:

  • 感谢您的回复我现在有一个工作模型,我很喜欢@andrewthompson 设置他的模型的方式
【解决方案2】:

这就是我的处理方式。不过,不是将外部面板添加到框架中,而是将其添加到选项卡式窗格的选项卡中。

以上是嵌套或复合布局的示例。带标题的边框显示了使用的布局和用于构造它们的参数(如果有的话)。

按钮的大小由内容(文本)建议。构造函数中建议了文本字段和文本区域的大小(其本身已作为文本值包含在内)。

要在文本字段中获得 TALL 效果,请设置一个 HUGE 字体,但为构造函数使用更少的列。

另见

另一个nested layout

【讨论】:

  • +1,我喜欢在 TitledBorder 中指定参数的想法 :-)
  • @nIcEcOw 我打算发布源代码(没有标题边框),但考虑到帖子的性质(学习如何使用布局),我觉得描述会更理想。并且'一张(布局的)图片描绘了一千个单词(当布局在标题边框中详细说明时)'.. ;)
  • 这太完美了,正是我需要的,我很感激不仅仅是把源代码放进去,因为我自然会只是复制和粘贴代码而不是真正学习材料。我现在就开始。
  • “我很感激不只是放源代码..” 你让我很开心。为你的态度 +1 - 我认为你会走得很远(当你到达那里时会受到好评)。
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多